为什么 (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.
在我的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.