为什么 (0 && 1 == 0) 不计算为真?

Why does (0 && 1 == 0) not evaluate to true?

在我的if语句中,&&的第一个条件是0(假),所以表达式0 && (a++)等于0,正确的?那么0==0应该是真的。为什么我在这里得到 else?请解释!

int a=0;
if(0 && (a++)==0)
{
    printf("Inside if");
}
else
{
    printf("Else");
}
printf("%i",a);

==运算符的优先级高于&&运算符,所以这一行:

if(0 && (a++)==0)

被这样对待:

if(  0 && ((a++)==0) )

所以 if 下的整个表达式都是假的,并且 a++ 由于 && 运算符的短路甚至没有计算。

您可以在 cppreference.com 上阅读有关 Operator Precedence and Associativity 的信息。

如有疑问,应使用括号清楚地表达您的意图。在这种情况下,它应该是:

if( (0 && (a++)) == 0  )

不过,它没有任何意义,因为它总是求值为 true 并且 a++ 也不会在此处递增。

前面已经提到,==的优先级高于&&的优先级,所以语句解析为

if( 0 && ((a++)==0))

但是,即使你加上正确的括号顺序,a++ return仍然是a的原始值,即0,但是a 递增。如果你想return a的更新值,你应该写++a

if( ((++a) && 0) == 0  )

虽然问题看起来很简单,但非常error-prone。 我们需要知道这里涉及到的各种运算符的优先级。

1. postfix (++)
2. ==
3. Logical AND (&&)

最终表达式可以看成:if ( (0 && (a++)) == 0 ) 这是真的。因此 if 下的语句被评估为 true.