根据我的有限知识,逻辑运算符具有从左到右的评估顺序。根据该规则,它应评估 x && y 为 1 ,然后应在if语句中评估 == 1 。但这是没有发生的事情。谁能帮我这个忙。
int main()
{
int x = 1, y = 2;
if (x && y == 1)
printf("true\n");
else
printf("false\n");
}
答案 0 :(得分:18)
答案 1 :(得分:3)
尝试一下。
由于https://en.cppreference.com/w/c/language/operator_precedence
int main()
{
int x = 1, y = 2;
if ((x && y) == 1)
printf("true\n");
else
printf("false\n");
}
答案 2 :(得分:2)
尽量不要过多考虑评估顺序。它经常会使您感到困惑。需要关注的更重要的事情是如何将运算符分组在一起以及表示表示什么。
&&
运算符的优先级相对较低。几乎在您每次使用它时,它都会具有以下形式
if( condition_1 && condition_b )
解释很明显:“如果condition_a
是真的 condition_b
是真的”。
在您的情况下,condition_a
仅是x
,而condition_b
是y == 1
。因此,解释为“如果x
为真并且 y
等于1”。
x
为真意味着什么?只是它不为零。因此,我们可以进一步扩展它:就像您已经写过
if ( x != 0 && y == 1 )
并且解释为“如果x
不等于0 并且 y
不等于1”。
请记住,优先级说明了如何将运算符组合在一起。就您而言,就好像您写过
if ( x && ( y == 1 ) )
== 1
部分与y
一起。 ==
的绑定比&&
更紧密。
就“求值顺序”而言,可以这样说,是的,编译器发出的代码确定x
是否为真,而代码则确定y
是否等于1。 ,然后使用&&
来确定它们是否都成立。在&&
的情况下,我们还知道它将在{em>之前决定x
是否为真。{em} y
和&&
运算符的一个相当特殊的属性,不是不适用于大多数其他更普通的运算符,例如||
和{{1 }}。
答案 3 :(得分:0)
因为y == 1
与y = 2
一样是假的,写在if
语句之前。
它不会评估您的想法。它先评估x
,然后再评估y == 1
,然后再评估&&
,在您的情况下,该评估在1 && 0
中得到false
。
答案 4 :(得分:0)
这是因为operator precedence。
由于 operator优先级,表达式if (x && y == 1)
的结果为if (x && (y == 1))
。
因此,整个表达式的结果为false
,因为y==1
是false
。
使用括号并将其更改为if ((x && y) == 1)
以获得所需的结果。
答案 5 :(得分:0)
这里
if (x && y == 1)
以上声明等同于
if(x && (y==1) ) /* y==1 performed first, which is false */
正如您在这里看到的https://en.cppreference.com/w/cpp/language/operator_precedence
您要获取true
作为输出,然后通过保留x&&y
首先执行()
。
if ( (x && y) == 1) { /* now () has higher precedence, so it perform x&&y first which results in true(1) and then 1==1 results in true */
}
else {
}