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

时间:2015-02-05 05:52:03

标签: c++ c ternary-operator conditional-operator

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

int main(void)
{
   int a=10,b;
   a>=5?b=100:b=200;
}

上述代码在 C 中指出左值时出错,而相同的代码在 C ++中编译正确

3 个答案:

答案 0 :(得分:17)

查看运算符优先级。

如果没有明确的(),您的代码就像

一样
( a >= 5 ? b = 100 :  b ) = 200;

?:表达式的结果不是可修改的左值 [#] ,因此我们无法指定任何值它

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

  

永远不允许在条件运算符右侧显示赋值

Relared Reference:C precedence table

OTOH,如果是c++,那么,

  

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

并从右到左分组,基本上使您的代码行为像

 a >= 5 ? (b = 100) : ( b = 200 );

因此,在c++

的情况下,您的代码可以正常运行

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

  

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

答案 1 :(得分:6)

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

b = a>=5?100:200;

应该适用于C和C ++。

答案 2 :(得分:5)

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

int main(void)
{
   int a=10,b;
   a>=5?(b=100):(b=200);
}

错误是因为您不关心运营商的优先级和评估顺序。