为什么 (0 && 1 == 0) 的计算结果不为 true?



在我的if语句中,&&的第一个条件是0(false),因此表达式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上阅读有关操作符优先级和结合性的内容。

当你有疑问时,你应该使用括号来清楚地表达你的意图。在本例中,它应该是:

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

虽然,它没有任何意义,因为它总是求值为true,a++在这里也不加1。

如前所述,==的优先级高于&&的优先级,因此该语句被解析为

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

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

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

虽然这个问题看起来很容易,但它很容易出错。我们需要知道其中涉及的各种操作符的优先级。

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

最终表达式可以看作:if ( (0 && (a++)) == 0 )这是真的。因此,if下的语句被求值为真。

最新更新