C语言中逻辑运算符与赋值运算符的求值顺序疑问
C语言中
a = b && c || d;的求值逻辑 先明确两个核心概念的区别:
- 优先级:决定代码的语法分组(也就是你提到的解析成
a = ((b && c) || d);),它只负责确定子表达式的绑定关系,不直接控制计算顺序。 - 求值顺序:是实际计算各个操作数、子表达式的先后顺序,C语言中部分运算符(如
&&、||、?:、赋值运算符)会规定明确的求值顺序。
针对你举的例子,具体求值步骤如下:
- 优先处理右侧的逻辑表达式
((b && c) || d):- 先执行
b && c的短路求值:- 先计算
b的值; - 如果
b为假(0),直接得出b && c的结果为假,不会再计算c; - 如果
b为真(非0),再计算c的值,最终得出b && c的结果。
- 先计算
- 接着执行
||的短路求值:- 用
b && c的结果作为左操作数; - 如果该结果为真,直接得出整个右侧表达式的结果为真,不会再计算
d; - 如果该结果为假,再计算
d的值,最终得出||运算的结果。
- 用
- 先执行
- 最后将右侧表达式的最终结果赋值给
a——因为赋值运算符=的优先级是所有运算符中最低的,所以必然是先完成右侧所有必要的计算,再执行赋值操作,不可能先赋值再计算右侧的逻辑表达式。
补充:赋值运算符是右结合的,但这个特性在单个赋值语句中体现不明显,它主要影响a = b = c;这类连续赋值场景(会解析为a = (b = c);,先执行b = c,再将结果赋值给a)。
内容的提问来源于stack exchange,提问作者Kain3
相关产品推荐
相关产品推荐

