为什么C语言三元运算符中无括号的赋值操作会触发编译错误
C语言三元运算符编译报错原因说明
核心是C语言运算符优先级规则导致的表达式解析逻辑不符合开发者预期:
- 首先明确两个相关运算符的优先级:三元运算符
?:的优先级高于赋值运算符=,编译器解析表达式时会优先处理?:逻辑,再处理赋值逻辑。 - 未加括号的原代码行
m>n?c=40: c=20;会被编译器按照优先级规则自动解析为以下逻辑:
此时赋值运算符( (m > n) ? (c = 40) : c ) = 20;=的左操作数是三元运算符的返回结果,该结果属于临时右值,不具备可被赋值的左值(lvalue)属性,因此编译器抛出lvalue required as left operand of assignment错误。 - 给分支的赋值语句加括号后,
m>n?(c=40): (c=20);的解析逻辑被括号强制修正:三元运算符的两个分支分别是独立的赋值表达式(c=40)和(c=20),运行时会根据条件直接给变量c赋值,不存在将右值作为赋值左操作数的问题,因此可以正常编译运行。
更符合C语言编码规范的写法是直接将赋值逻辑提取到三元表达式外部,可读性更高:
c = m > n ? 40 : 20;
内容的提问来源于stack exchange,提问作者Vedant Khandelwal
相关产品推荐
相关产品推荐

