C与C++中的三元运算符

9 c c++ ternary-operator conditional-operator

C和C++之间存在很多差异,并且卡在其中一个上相同的代码在C中产生错误而在C++中执行正常请解释原因

int main(void)
{
   int a=10,b;
   a>=5?b=100:b=200;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在C中给出了一个错误,说明了所需的左值,而相同的代码在C++中编译得很好

Sou*_*osh 18

看看运营商的优先级.

没有明确()的代码行为就像

( a >= 5 ? b = 100 :  b ) = 200;
Run Code Online (Sandbox Code Playgroud)

?:表达式的结果不是可修改的左值 [#],因此我们无法为其赋值.

另外,值得一提的是,根据c语法规则,

永远不允许赋值出现在条件运算符的右侧

Relared Reference:C优先级表.

OTOH,万一c++,好吧,

条件运算符与赋值具有相同的优先级.

从右到左分组,基本上使你的代码表现得像

 a >= 5 ? (b = 100) : ( b = 200 );
Run Code Online (Sandbox Code Playgroud)

所以,你的代码可以正常工作 c++


[#] - 根据第6.5.15章,脚注(12),C99标准,

条件表达式不会产生左值.


Ell*_*sch 6

因为C和C++不是同一种语言,而你忽略了三元所暗示的赋值.我想你想要的

b = a>=5?100:200;
Run Code Online (Sandbox Code Playgroud)

这应该适用于C和C++.


Gop*_*opi 5

在C中,您可以通过将表达式放在括号内来修复它,以便在评估赋值时变为有效.

int main(void)
{
   int a=10,b;
   a>=5?(b=100):(b=200);
}
Run Code Online (Sandbox Code Playgroud)

错误是因为您不关心运算符的优先级和评估顺序.