用C语言中的++运算符对语句进行短路评估
我在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);
我获得的输出如下,
a=1 b=0 c=0
由于短路评估,这非常有意义。
表达式a++
是后递增, 0
是返回逻辑和( &&
)。 因此,不评估部分b++
因为0 && 0
和0 && 1
计算为0
。
但这引起了我的怀疑。 运算符的优先级值清楚地表明++
具有比&&
更高的优先级。 所以我的理解是这样的,对a++
和b ++都进行了评估,然后&&
只检查表达式a++
的结果来做出决定。 但这并没有发生只有这里评估a++
。
这种行为的原因是什么? &&
作为序列点是否与此行为有关? 如果是这样,为什么我们说&&
优先级低于++
?
您对评估的 优先顺序和顺序感到困惑。
优先级定义了运算符的分组方式,即
c = a++ && b++;
相当于:
c = ((a++) && (b++));
评估顺序定义了如何评估表达式, &&
的短路意味着首先评估a++
,如果它是零,则结束; 如果它不为零,则评估b++
。
另一个例子:
c = (a++) + (b++);
是否在b++
之前评估了b++
? 答案是我们不知道。 大多数运营商没有定义评估顺序。 &&
是少数几个定义的运算符之一。 (其余的是||
,
和?:
||
这里有两个概念 – 优先顺序和评估顺序。 只有在计算表达式(或子表达式)时,优先顺序才会产生影响。
通常,评估顺序不是按顺序排列的。 给定运算符,可以按任何顺序评估其操作数。 可以按任何顺序计算函数的参数。
从C ++标准:
1.9程序执行
15除非另有说明,否则对单个算子的操作数和个别表达式的子表达式的评估是不合理的。
和
8.3.6默认参数
9每次调用函数时都会计算默认参数。 函数参数的评估顺序未指定。
对于逻辑AND运算符&&
,C ++ 11标准说:
5.14逻辑AND运算符
1
&&
运算符从左到右分组。 操作数都在上下文中转换为bool
类型(第4条)。 如果两个操作数都为true
则结果为true
,否则为false
。 与&
不同,&&
保证从左到右的评估:如果第一个操作数为false
则不评估第二个操作数。
为逻辑OR运算符||
指定了类似的exception 。
由于由于&&
运算符导致表达式短路而未对b++
求值,因此在这种特定情况下,运算符的优先顺序没有意义。