0

我正在尝试编写一个程序,该程序接受用户输入的区号,并在此基础上根据此表显示区号所针对的相应区域:

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

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

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

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

第478章 --------- 梅肯

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

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

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

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

第912章 ---------萨凡纳

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

#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;
}

4

2 回答 2

2

这样的if语句

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

相当于以下

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

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

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

3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。

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

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

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

看来你的意思如下

}else if ( ( AreaNum == 404 ) || ( AreaNum == 470 )|| ( AreaNum == 678 ) || ( AreaNum == 770 ) ){
于 2020-05-12T23:00:35.153 回答
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");
}
于 2020-05-12T22:58:53.080 回答