C:逻辑运算符

标签 c if-statement logical-operators

在此代码中,用户必须输入他/她在某个科目上的成绩 (1-10) 以及他/她的缺勤 (0-14)。如果他/她的成绩 >=5 且缺勤 <=2 次,则学生通过。

我对成绩和缺勤人数可能超出该计划的限制有疑问。哪些是“正确的”逻辑运算符:

#include <stdio.h>
#include <stdlib.h>
int main()
{   
    int gr, ap;

    printf("GIVE YOUR SUBJECT GRADE:\n");
    scanf("%d", &gr);
    printf("GIVE YOUR SUBJECT ABSENCES\n");
    scanf("%d", &ap);

    if (ap >= 0 && ap <= 14 && gr >= 0 && gr <= 10)
    {
       if (gr >= 5 && ap <= 2)
          printf("YOU PASSED!\n");
       else if (gr < 5 && ap <=2)
          printf("FAILED DUE TO YOUR GRADE\n");
       else if (gr >= 5 && ap > 2)
          printf("FAILED DUE TO YOUR ABSENCES\n");
       else if (gr < 5 && ap > 2)
          printf("FAILED DUE TO YOUR GRADE AND ABSENCES\n");   
    }
    else 
     {                    
        if (ap >= 0 && ap <= 14 && gr < 0 || gr > 10)  
             printf("FALSE GRADE NUMBER\n");       
        else if (gr >= 0 && gr <= 10 && ap < 0 || ap > 14)
             printf("FALSE ABSENCES NUMBER\n");
//here is the problem
        else if (gr < 0 || gr > 10 && ap < 0 || ap > 14) 
             printf("FALSE ABSENCES AND GRADE NUMBERS\n");
      }     
    system("pause");
    return 0;
}

最佳答案

由于 && 优先于 ||,因此此处需要括号:

ap >= 0 && ap <= 14 && (gr < 0 || gr > 10)
//                     ^                 ^

否则,条件被解释为

(ap >= 0 && ap <= 14 && gr < 0) || (gr > 10)

这会导致问题。

其他两个条件也是如此 - 它们应该如下:

(gr >= 0 && gr <= 10) && (ap < 0 || ap > 14)
(gr < 0 || gr > 10) && (ap < 0 || ap > 14)

请注意,当您一遍又一遍地评估相同的条件时,最好创建一个变量来存储一次结果,然后再使用该变量:

int validGrade = gr > 0 && gr <= 10;
int validAbsences = ap >= 0 && ap < 14;

现在你可以编写如下代码:

if (validGrade && validAbsences) {
    ...
} else {
    if (validAbsences && !validGrade) {
        ...
    } else if (!validAbsences && validGrade) {
        ...
    } else {
        ...
    }
}

关于C:逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34108817/

相关文章:

c# 新手 : if statement && with int

C:以下代码的输出是什么?请解释一下

haskell - Haskell 中的运算符 && 是否严格?

c - 正确读取 'int * ptr=&x' 的方法

c++ strtok 跳过第二个标记或连续的定界符

c++ - C++ 中相同的 cv 函数 (opencv)

c - 在 C 语言中正确使用 EOF

swift - 如何在 Swift 中对 UILabel 和 String 使用 IF 语句?

Java:将电话键盘上的字母转换为数字

c - 让程序在 C 中再次运行