C ++运算符如何工作

时间:2010-09-28 03:10:36

标签: c++ operators operator-precedence

假设x = 2,y = 1,z = 0,下面的语句会显示什么?

printf("answer = %d\n", (x || !y && z));

这是在一个测验中,我弄错了,我不记得我的教授覆盖了这个,请有人开导我...我知道我得到的答案是1,但为什么?

5 个答案:

答案 0 :(得分:3)

表达式被解释为x || (!y &&z)(查看运算符||!&&的优先级。

||short-circuiting运营商。如果左操作数为真(在||的情况下),则不需要评估右侧操作数。

在你的情况下x为真,所以作为一个布尔表达式,结果将是1。

修改

&&||的评估顺序保证从左到右。

答案 1 :(得分:1)

如果我没弄错,它会打印1.(假设短路已关闭)

(x || !y && z)(true || !true && false)将首先评估!运营商给予(true || false && false)

然后是&&amp ;: (true || false)

然后|| :true

Printf会将十进制的真值解释为1.因此它会打印answer = 1\n

答案 2 :(得分:0)

  

假设x = 2,y = 1,z = 0,   以下是什么声明   显示?

     

printf(“answer =%d \ n”,(x ||!y&& z));

好的 - 感觉有点内疚,因为这个问题严厉的措辞不好,所以我会尝试以不同的方式帮助你解决其他问题...: - )

当您遇到这样的问题时,将其分解为可管理的块。

尝试:

int x = 2, y = 1, z = 0;

printf("true == %d\n", 10 > 2);                 // prints "1"
printf("false == %d\n", 1 == 2);                // prints "0"
printf("!y == %d\n", !y);                       // prints "0"
printf("(x || !y) == %d\n", x || !y);           // "1" - SEE COMMENTS BELOW
printf("(!y || z) == %d\n", !y || z);           // "0"
printf("(x || !y && z) == %d\n", x || !y && z); // "1"

在那里的输出中,你已经拥有了推断正在发生的事情所需的一切:

  • true == 1揭示了C / C ++如何将真实的布尔表达式转换为printf的整数值1,而不考虑布尔表达式中出现的值
  • false == 0揭示了C / C ++如何将虚假表达式转换为“0”
  • (!y) == 0因为!是逻辑非运算符,并且C / C ++认为0是唯一对应于false的整数值,而所有其他值都是true,因此!1 == !true == false == 0
  • (x || !y) == 1,您知道!y为0,因此替换已知值并简化:(2 || 0) == 1相当于(true or false) == true ... 这是可以理解的逻辑规则
  • (!y || z) == 0 - 替换已知值:(0 || 0) == (false or false) == false == 0
  • (x || !y && z) == 1:这是紧张局势!从上面,我们知道:
    • x || !y是1 / true,如果相关则意味着1 / true&& z / 0 / false == 1 / true< - 这显然没有任何意义,所以它一定不是C / C ++计算答案的方式!
    • (!y&& z)为false,如果相关则表示x / 2 / true || false == 1 / true< - 这是真的,所以它必须是隐含的顺序。

通过这种方式,我们得出了运算符优先级 - ||的求值顺序和&&运算符,从编译器显示的结果,并看到,当且仅当&&在||之前评估然后我们可以对结果有所了解。

答案 3 :(得分:-1)

answer = 1

或者也许:

answer = -27
2 || !1 && 0
2 || 0 && 0
2 || 0
true
true = non-zero value
printf("answer = %d",*true*); -> who knows

大多数编译器都会输出answer = 1。我不会自信地声明所有编译器都会这样做,但我相信所有编译器都会返回非零值。

答案 4 :(得分:-2)

我不打算给你直接答案,因为你可以编译并运行它,但问题只是测试你是否知道运算符优先级。