if语句内部表达式的后增量

问题描述:

在下面的代码中,我期待回答'是'。但答案是否定的。这意味着我在& &操作后得到递增。我期待我在if()被评估的时候一次完整的表达就会增加。那么与后增量相关的规则是什么?if语句内部表达式的后增量

int main() 
{ 
    int i = 1; 
    if (i++ && (i == 1)) 
     printf("Yes\n"); 
    else 
     printf("No\n"); 
} 
+6

对于'&&',左侧首先被完全评估,其中包括递增'i'。它不是'++'你应该问的,而是'&&'。 – Cornstalks

+0

这是所有逻辑运算符的情况还是只有其中几个? – Rajesh

+3

这是'&&'和'||'的情况,因为它们的[短路行为](https://stackoverflow.com/questions/628526/is-short-circuiting-logical-operators-mandated-and-评估顺序)。这两个操作员都会首先全面评估左侧的参数。根据评估的结果,可能(或可能不)继续并评估右边的论点。 – Cornstalks

它编译从左至右,从上到下,所以这是合乎逻辑的,你有一个“不”,你if语句包含i++这将导致我等于2,然后返回true,那么它包含i==1,它将返回false,因为我不再等于1,所以你的if语句返回false,这将使其执行else上的内容,意思是“否”。

约逻辑运算符一个简单的解释:

& &:从从左向右计算,所有的评估条件,必须返回“真”,因此它可以是真实的。

||:从左向右进行评估,只是一旦找到一个真实的条件,它就会以真值结束评估。

逻辑运算符&&有左操作数的评价和正确的操作数之间的序列点。这意味着左操作数首先被计算,并伴随着任何副作用(在本例中为增量)。

在此表达式中,i的值为1.因此表达式i++的值为1,并且值i递增。

作为&&运算符的左侧,此值的计算结果为true,因此将评估右侧。如果该值为0,即错误,则不评估右侧。

此时的i的值是2,所以i == 1评估为假,使操作者&&虚假的结果。这导致执行else子句。