C语言运算符优先级疑问:逻辑与为何未触发后置自增?
问题解答
先看你给出的代码:
int a = 1, b = 2, c = 3; printf("%d ", c - 3 && b++ > c); printf("%d %d %d", a, b, c);
你疑惑的核心是为什么b没有自增,这和运算符优先级无关,根源是逻辑与&&的短路求值规则:
- 逻辑与
&&的求值逻辑是:先计算左操作数,若左操作数结果为0(假),整个表达式的结果必然是0,此时右操作数会被直接跳过,完全不会执行。 - 你的表达式中,左操作数
c-3计算结果为3-3=0,属于假,因此右边的b++ > c根本没机会运行,b的自增操作自然不会发生,最终输出里b还是初始值2。
再明确两个容易混淆的概念:
- 运算符优先级:仅决定表达式的语法分组,比如你的表达式会被分组为
(c-3) && ((b++) > c),这部分你的理解是对的,但优先级不决定操作数的求值顺序。 - 求值顺序:逻辑运算符
&&、||和条件运算符?:是C语言里少数规定了严格求值顺序的运算符——左操作数先求值,右操作数的求值与否完全取决于左操作数的结果。
所以不是逻辑运算符绕过了优先级,而是优先级管的是表达式的结构,短路求值管的是哪些部分会被实际执行。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

