用C语言中的++运算符对语句进行短路评估

Dee*_*epu 15 c operator-precedence short-circuiting

我在Windows 7上的Code :: Blocks 10.05中执行了以下代码.

int a=0,b=0,c;
c=a++&&b++;
printf("\na=%d\nb=%d\nc=%d\n\n",a,b,c);
Run Code Online (Sandbox Code Playgroud)

我获得的输出如下,

a=1
b=0
c=0
Run Code Online (Sandbox Code Playgroud)

由于短路评估,这非常有意义.

表达式a++是后递增的,0并返回到逻辑和(&&).因此,部分b++不评估,因为两个0 && 00 && 1的计算结果为0.

但这引起了我的怀疑.运营商的优先价值清楚地表明,++优先级高于&&.所以我的理解是这样的,a++并且b ++都被评估,然后&&只检查表达式的结果a++来做出决定.但这并没有发生,只是a++在这里评估.

这种行为的原因是什么?是否&&是一个顺序点事做这种行为?如果是这样,为什么我们说&&优先级低于++

Yu *_*Hao 34

对评估的优先顺序顺序感到困惑.

优先级定义了运算符的分组方式,即

c = a++ && b++;
Run Code Online (Sandbox Code Playgroud)

相当于:

c = ((a++) && (b++));
Run Code Online (Sandbox Code Playgroud)

评估顺序定义了如何评估表达式,首先评估&&平均值的短路a++,如果它是零,则结束; 如果它不为零,b++则进行评估.


另一个例子:

c = (a++) + (b++);
Run Code Online (Sandbox Code Playgroud)

a++之前评估b++?答案是我们不知道.大多数运营商没有定义评估顺序.&&是少数几个定义的运营商之一.(其余的是||,,?:)