假设我有一个链表L,它可能是NULL或不是。当我尝试
!L ? s+=2 : t+=2;
编译器抱怨左值作为赋值的左操作数是必需的。我错过了什么?算子优先级,也许?
答案 0 :(得分:3)
相关的语法生成是:
条件表达式:
逻辑或表达
logical-OR-expression ? 表达 : 条件表达式 < / p>
t+=2
不是条件表达式,因此编译器必须将!L ? s+=2 : t+=2
解释为等同于(!L ? s+=2 : t)+=2
。在C中,条件表达式永远不会产生左值,因此不能出现在+=
的左侧。
(t+=2)
是条件表达式,因此!L ? s+=2 : (t+=2)
是正确的。
作为参考,在C ++中,相关的语法产生是:
条件表达式:
逻辑或表达
逻辑或表达式 ? 表达式 : assignment-expression < / p>
t+=2
是一个赋值表达式,因此!L ? s+=2 : t+=2
是有效的C ++,并按照您的想法行事。
有趣的是,在C ++中,条件运算符可以产生左值,如果其第二个和第三个操作数的未衰减公共类型是左值。但如果我对标准的解读是正确的,那么这个事实与这种情况无关。
答案 1 :(得分:2)
在C语言中,您应该在第二个术语中使用括号,因为您认为运算符优先级。
!L ? s+=2 : (t+=2);
在C ++中,您不需要括号。