为什么 (0 && 1 ==0) 不是真的?

Spa*_*ark 3 c c++ if-statement logical-operators equals-operator

在我的if陈述中, for 的第一个条件&&0(false),所以表达式0 && (a++)等于0,对吗?那么0==0它应该是真的。我为什么else到这里?请解释!

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

Sla*_*ica 19

==经营者具有比更高的优先级&&运营商,所以这行:

if(0 && (a++)==0)
Run Code Online (Sandbox Code Playgroud)

是这样处理的:

if(  0 && ((a++)==0) )
Run Code Online (Sandbox Code Playgroud)

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

您可以在 cppreference.com 上阅读有关运算符优先级和关联性的信息。

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

if( (0 && (a++)) == 0  )
Run Code Online (Sandbox Code Playgroud)

尽管如此,它没有任何意义,因为它总是评估为true并且a++在这里也没有增加。

  • 请注意,即使在修订版本中,a++也永远不会执行。 (2认同)

Kar*_*yan 5

正如已经提到的, 的优先级==高于 的优先级&&,因此该语句被解析为

if( 0 && ((a++)==0))
Run Code Online (Sandbox Code Playgroud)

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

if( ((++a) && 0) == 0  )
Run Code Online (Sandbox Code Playgroud)