在我的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下的语句被求值为真。