C 运算符优先级的混乱

问题描述 投票:0回答:1

我对以下代码块很困惑:

int a = 1, b = 2, c = 3;

printf("%d ", c - 3 && b++ > c);

printf("%d %d %d", a, b, c);

最初,我认为输出会是

0 1 3 3
,因为由于后修复运算符的副作用,b 会变成 3。但是,我得到的输出是
0 1 2 3
。这是为什么?

具体来说,为了评估

c - 3 && b++ > c
,我使用了 C 运算符优先级表 (https://en.cppreference.com/w/c/language/operator_precedence#cite_note-1) 来确定运算符优先级。后缀增量运算符的优先级比逻辑 AND 运算符高得多。那么为什么输出是这样的呢?逻辑运算符是否会以某种方式绕过 C 中的运算符优先级?

c operators
1个回答
0
投票

运算符优先级决定了操作数的分组方式,而不是它们的求值顺序。所以这个:

c - 3 && b++ > c

解析如下:

(c - 3) && ((b++) > c)

逻辑运算符

&&
||
具有所谓的 短路 行为,这意味着如果可以仅从左操作数确定结果,则不会评估右操作数。

&&
的左操作数是
c - 3
。其计算结果为 0,这意味着整个
&&
表达式的计算结果为 0,并且右侧操作数(即
b++ > c
)未计算,因此
b
未递增。

© www.soinside.com 2019 - 2024. All rights reserved.