C中的三元算子与左值

C中的三元算子与左值,c,C,假设我有一个链表L,它可能是空的,也可能不是空的。当我尝试 !L ? s+=2 : t+=2; 编译器抱怨赋值的左操作数需要左值。我错过了什么?运算符优先级,也许?在C中,第二项应该使用括号,因为运算符优先级正如您所想的那样。 !Ls+=2:(t+=2) 在C++中,你不需要括号。C中的在第二个术语中应该使用括号,因为你认为操作符优先。 !Ls+=2:(t+=2) 在C++中,你不需要括号。< / P> < P>相关语法的产生是: 条件表达式: 逻辑或表达式 逻辑或表达式?表达式:条件表

假设我有一个链表L,它可能是空的,也可能不是空的。当我尝试

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

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

在C中,第二项应该使用括号,因为运算符优先级正如您所想的那样。
!Ls+=2:(t+=2)


在C++中,你不需要括号。C中的

在第二个术语中应该使用括号,因为你认为操作符优先。
!Ls+=2:(t+=2)


在C++中,你不需要括号。< / P> < P>相关语法的产生是:

条件表达式:

逻辑或表达式

逻辑或表达式表达式条件表达式

t+=2
不是条件表达式,因此编译器必须解释
!Ls+=2:t+=2
相当于
(!L?s+=2:t)+=2
。在C语言中,条件表达式永远不会产生左值,因此不能出现在
+=
的左侧

(t+=2)
是一个条件表达式,所以
!Ls+=2:(t+=2)
正确


在C++中,相关语法的产生是:

条件表达式:

逻辑或表达式

逻辑或表达式表达式赋值表达式

t+=2
是赋值表达式,因此
!LS+= 2:T+=2 < /COD>是有效C++,并按照您的想法执行。

有趣的是,在C++中,条件运算符可以产生一个LValk,如果它的第二个和第三个操作数的未被删除的公共类型是一个LValk。但如果我对标准的理解是正确的,那么这一事实与本案无关。

相关的语法产物是:

条件表达式:

逻辑或表达式

逻辑或表达式表达式条件表达式

t+=2
不是条件表达式,因此编译器必须解释
!Ls+=2:t+=2
相当于
(!L?s+=2:t)+=2
。在C语言中,条件表达式永远不会产生左值,因此不能出现在
+=
的左侧

(t+=2)
是一个条件表达式,所以
!Ls+=2:(t+=2)
正确


在C++中,相关语法的产生是:

条件表达式:

逻辑或表达式

逻辑或表达式表达式赋值表达式

t+=2
是赋值表达式,因此
!LS+= 2:T+=2 < /COD>是有效C++,并按照您的想法执行。

有趣的是,在C++中,条件运算符可以产生一个LValk,如果它的第二个和第三个操作数的未被删除的公共类型是一个LValk。但如果我对标准的理解是正确的,那么这一事实与本案无关。

是的,优先权。见例。或者干脆做
!Ls+=2:(t+=2)
。不确定这在C中是否有效,但如果是java,您可以通过简单地添加两个括号来修复它,以使意图更加清楚。由于您没有指定
s
t
是什么,它是否与“正常的”
if/else
块一起工作?@barakmanos:它们是
int
s@马夫索是对的,是的,优先权。见例。或者干脆做
!Ls+=2:(t+=2)
。不确定这在C中是否有效,但如果是java,您可以通过简单地添加两个括号来修复它,以使意图更加清楚。由于您没有指定
s
t
是什么,它是否与“正常的”
if/else
块一起工作?@barakmanos:它们是
int
s@mafso是对的。出于我的好奇心,你能澄清一下编译器是如何解释原始代码段的,以及为什么括号会解决这个问题吗?@Riley我想另一个答案涵盖了你的问题。:)出于好奇,您能否澄清一下编译器是如何解释原始代码段的,以及为什么括号可以解决这个问题?@Riley我想另一个答案涵盖了您的问题。:)