如果语句给出错误的结果
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 ) ){
我正在尝试编写一个程序,它接受用户输入的区号,并基于此显示区号对应的相应区域 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 ) ){