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

Ternary operator in C vs C++

C 和 C++ 之间有很多差异,并且卡在其中之一 相同的代码在 C 中出错,而在 C++ 中执行良好 请说明原因

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

上面的代码在 C 中给出了一个错误,指出 lvalue 是必需的,而相同的代码在 C++

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

b = a>=5?100:200;

它应该在 C 和 C++ 中工作。

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

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

错误是因为您不关心运算符的优先级和计算顺序。

查看运算符优先级。

没有明确的 () 你的代码表现得像

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

?: 表达式的结果不是 可修改的左值 [#] 因此我们不能 分配任何值给它。

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

assignment is never allowed to appear on the right hand side of a conditional operator

相关参考:C precedence table.

OTOH,在 c++ 的情况下,

the conditional operator has the same precedence as assignment.

并且从右到左分组,本质上使您的代码表现得像

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

因此,您的代码在 c++

的情况下工作正常

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

A conditional expression does not yield an lvalue.