if语句内部表达式的后增量
问题描述:
在下面的代码中,我期待回答'是'。但答案是否定的。这意味着我在& &操作后得到递增。我期待我在if()被评估的时候一次完整的表达就会增加。那么与后增量相关的规则是什么?if语句内部表达式的后增量
int main()
{
int i = 1;
if (i++ && (i == 1))
printf("Yes\n");
else
printf("No\n");
}
答
它编译从左至右,从上到下,所以这是合乎逻辑的,你有一个“不”,你if
语句包含i++
这将导致我等于2,然后返回true
,那么它包含i==1
,它将返回false
,因为我不再等于1,所以你的if
语句返回false,这将使其执行else
上的内容,意思是“否”。
约逻辑运算符一个简单的解释:
& &:从从左向右计算,所有的评估条件,必须返回“真”,因此它可以是真实的。
||:从左向右进行评估,只是一旦找到一个真实的条件,它就会以真值结束评估。
答
逻辑运算符&&
有左操作数的评价和正确的操作数之间的序列点。这意味着左操作数首先被计算,并伴随着任何副作用(在本例中为增量)。
在此表达式中,i
的值为1.因此表达式i++
的值为1,并且值i
递增。
作为&&
运算符的左侧,此值的计算结果为true,因此将评估右侧。如果该值为0,即错误,则不评估右侧。
此时的i
的值是2,所以i == 1
评估为假,使操作者&&
虚假的结果。这导致执行else
子句。
对于'&&',左侧首先被完全评估,其中包括递增'i'。它不是'++'你应该问的,而是'&&'。 – Cornstalks
这是所有逻辑运算符的情况还是只有其中几个? – Rajesh
这是'&&'和'||'的情况,因为它们的[短路行为](https://stackoverflow.com/questions/628526/is-short-circuiting-logical-operators-mandated-and-评估顺序)。这两个操作员都会首先全面评估左侧的参数。根据评估的结果,可能(或可能不)继续并评估右边的论点。 – Cornstalks