C和C++中的三目运算符

12

C和C++存在许多差异,其中一个问题困扰着我:相同的代码在C中会出现错误,而在C++中则可以正常执行。请解释原因。

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

上述代码在 C 中报错,提示需要 左值表达式,但是在 C++ 中可以正常编译

3个回答

20

请查看运算符优先级。

如果没有显式地使用 (),您的代码会像这样运行

( a >= 5 ? b = 100 :  b ) = 200;
< p >一个?:表达式的结果不是一个可修改的左值(modifiable lvalue[#],因此我们不能对其进行任何赋值操作。

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

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

相关参考:C运算符优先级表

而在中,

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

并且从右到左分组,从本质上讲,使您的代码行为类似于

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

因此,在c++的情况下,您的代码可以正常工作。


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

条件表达式不会产生一个lvalue。


7
由于C和C ++不是同一种语言,并且您忽略了三元运算符所暗示的赋值。我认为您想要的是:
b = a>=5?100:200;

这段代码应该能够在C和C++中都正常工作。


6
在C语言中,你可以通过将表达式放在括号中来修复它,这样在评估赋值时就变得有效了。
int main(void)
{
   int a=10,b;
   a>=5?(b=100):(b=200);
}

错误是因为您不关心操作符优先级和评估顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接