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.
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.