C中的三元运算符和左值

时间:2014-07-26 16:08:56

标签: c

假设我有一个链表L,它可能是NULL或不是。当我尝试

   !L ? s+=2 : t+=2;

编译器抱怨左值作为赋值的左操作数是必需的。我错过了什么?算子优先级,也许?

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 ++中,您不需要括号。