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