【问题标题】:If statement gives wrong result如果语句给出错误的结果
【发布时间】:2020-08-28 23:33:35
【问题描述】:

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

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

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

【问题讨论】:

  • A == B || C 并没有按照你的想法去做。
  • @Beta 请解释一下它的作用。

标签: c if-statement int printf logical-or


【解决方案1】:

这样的if语句

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

等价于以下

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

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

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

3 ||如果任一操作数比较,则运算符应产生 1 不等于0;否则,它产生 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 ) ){

【讨论】:

  • 很好的解释,但你能不能再用一种技术性较低的语言解释一下,我是编程新手,发现解释很难理解
  • @Qasim 在 C 中任何不等于 0 的表达式都被评估为真。例如 if( 1 ) {} 计算结果为真。所以如果你写 if ( 2 == 5 || 10 ) {} 相当于 if ( ( 2 == 5 ) || ( 10 ) ) {} 那么 10 不等于 0 那么整个表达式的计算结果为真,即使 2 不等于 5。
  • @Qasim 正如 C 标准的引用中所写,如果表达式的计算结果不等于 0,则条件为真。表达式 2 == 5 产生 0。表达式 2 == 2 产生 1。所以 2 == 5 产生 0 但 10 != 0 产生 1。所以整个表达式产生 1。它是逻辑 OR 运算符。当两个操作数都产生 1 以提供整个表达式为真时,这不是逻辑 AND 运算符。
  • @Qasim 404 不是 0。它是 404 不等于 0。所以如果这是语句 if (404) {} 等价于 if (404 != 0) {}。在来自答案的示例中,使用了表达式 AreaNum == 404,如果 AreaNum 等于 404,则计算结果为 1,否则计算结果为 0。
  • @Qasim 我建议您更频繁地访问此站点并尝试回答其他人的问题。
【解决方案2】:

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");
}

【讨论】:

  • 请详细说明答案并告诉我它的作用
  • @Qasim 你不明白哪一部分?
  • “你说 AreaNum == 404 || 470 || 678 || 770 不做你想做的事”为什么不做,为什么它评估为真
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2014-04-12
相关资源
最近更新 更多