c - C 中带有++ 运算符的语句的短路评估

标签 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);

我得到的输出如下,

a=1
b=0
c=0

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

表达式a++后自增,0返回逻辑与(&&)。因此 b++ 部分不会被评估,因为 0 && 00 && 1 的计算结果为 0

但是这里出现了我的疑问。运算符的优先级值明确指出 ++&& 具有更高的优先级。所以我的理解是这样的,a++ 和 b++ 都被评估,然后 && 只检查表达式 a++ 的结果来做出决定。但这并没有发生,只有 a++ 在这里被评估。

这种行为的原因是什么? && 是一个序列点是否与此行为有关?如果是这样,为什么我们说 && 的优先级低于 ++

最佳答案

您对优先级求值顺序感到困惑。

优先级定义运算符如何分组,即

c = a++ && b++;

相当于:

c = ((a++) && (b++));

求值顺序定义了表达式的求值方式,&&的短接表示a++先求值,为0则结束;如果它不为零,则计算 b++


再举个例子:

c = (a++) + (b++);

a++ 是否在 b++ 之前评估?答案是我们不知道。大多数运算符不定义求值顺序。 && 是为数不多的定义的运算符之一。 (其余分别是||?:)

关于c - C 中带有++ 运算符的语句的短路评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31779410/

相关文章:

C无法使用变量打开文件

ruby - 一元运算符的运算符优先级

java - Sorted() 和 concat() 的奇怪流行为

java - 短路和一元运算符的工作

sql - COALESCE - 保证短路吗?

linux - 为什么 bash 不会因短路命令序列中的错误而停止?

将 unsigned char* 转换为 long

c++ - 为什么使用rand生成随机数之前需要调用srand

c - 为什么会出现这个段错误?

haskell - 为什么简单的 Haskell 函数会拒绝表示为比率的 Fractional 参数?