如果语句给出错误的结果

If statement gives wrong result

我正在尝试编写一个程序,它接受用户输入的区号,并基于此显示区号对应的相应区域 table:

区号------------主要城市

229 ------------------奥尔巴尼

404 ------------------ 亚特兰大

470 ------------------ 亚特兰大

478 ------------------ 梅肯

678 ------------------ 亚特兰大

706 --------------------哥伦布

762 --------------------哥伦布

770 ------------------ 亚特兰大

912 ------------------萨凡纳

这是我下面的代码,我遇到的问题是 IF 语句给我不正确的结果,例如,如果我输入 912,它会给我 "Atlanta"这是不正确的,因为在 IF 语句中它说如果 912 等于用户输入 "Savannah" 应该显示。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
int main(){

int AreaNum;

printf("enter a area code: ");
scanf("%d", &AreaNum);

if (AreaNum == 229){
printf("Albany");
}else if (AreaNum == 404 || 470 || 678 || 770){
printf("Atlanta");
}else if (AreaNum == 478){
printf("Macon");
}else if (AreaNum == 706 || 762){
printf("Columbus");
}else if (AreaNum == 912){
printf("Savannah");
}else
printf("Area code not recognized");

  return 0;
}

AreaNum == 404 || 470 || 678 || 770 不做你想做的事,实际上总是计算为真。这是因为按照操作顺序,它实际上是 (AreaNum == 404) || 470 || 678 || 770,所以在检查第一个之后,只会有一个没有检查的数字,而在 C 中,非零数字是真实的。你有两个选择。要么以长格式将它们全部写出来,如 AreaNum == 404 || AreaNum == 470 || AreaNum == 678 || AreaNum == 770,要么使用 switch 语句而不是你的 if 语句,如下所示:

switch(AreaNum) {
case 229:
    printf("Albany");
    break;
case 404:
case 470:
case 678:
case 770:
    printf("Atlanta");
    break;
case 478:
    printf("Macon");
    break;
case 706:
case 762:
    printf("Columbus");
    break;
case 912:
    printf("Savannah");
    break;
default:
    printf("Area code not recognized");
}

像这样的if语句

}else if (AreaNum == 404 || 470 || 678 || 770){

相当于下面的

}else if ( ( AreaNum == 404 ) || ( 470 )|| ( 678 ) || ( 770 ) ){

因此,例如,如果第一个子表达式 AreaNum == 404 的计算结果为 false,那么第二个和后续表达式(如 ( 470 ))不等于零,因此它们的计算结果为 true,整个表达式产生值为真。

来自 C 标准(6.5.14 逻辑或运算符)

3 The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.

并且上面表达式中的 470、678 或 770 都不等于 0。因此,无论 AreaNum 是否等于 404,此 if 语句中的条件始终为真。

也就是上面的if语句可以等价改写成下面的方式

}else if ( ( AreaNum == 404 ) || ( 470 != 0 )|| ( 678 != 0 ) || ( 770 != 0 ) ){

看来你的意思如下

}else if ( ( AreaNum == 404 ) || ( AreaNum == 470 )|| ( AreaNum == 678 ) || ( AreaNum == 770 ) ){