我有一段 C 代码如下:
main()
{
int a=10, b;
a>=5 ? b=100 : b=200 ;
printf("%d" , b);
}
在 unix 中的 gcc 编译器上运行代码会生成编译时错误,如下所示 “需要左值作为赋值的左操作数”并将错误指向 b = 200,而在 Windows 中使用 Turbo C 编译时输出 200。
谁能解释一下这种情况到底发生了什么?
最佳答案
在 C 中,三元运算符定义如下
逻辑或表达式 ?表达式:条件表达式
条件表达式的定义如下
logical-OR-expression
赋值运算符的优先级低于 OR 运算符。因此你必须写
a >= 5 ? b = 100 : ( b = 200 );
否则编译器认为这样的表达式
( a >= 5 ? b = 100 : b ) = 200;
由于 C 中三元运算符的结果不是左值,因此上述表达式无效,编译器发出错误。
来自 C 标准:
the result is the value of the second or third operand (whichever is evaluated), converted to the type described below
和脚注:
110) A conditional expression does not yield an lvalue.
请注意,C 和 C++ 中的运算符定义之间存在本质区别。在 C++ 中它被定义为
逻辑或表达式?表达式:赋值表达式
在 C++ 中,相同的 GCC 成功编译了代码
#include <iostream>
int main()
{
int a = 10, b;
a >= 5 ? b = 100 : b = 200;
std::cout << "b = " << b << std::endl;
return 0;
}
关于c - 在 c 中使用三元运算符的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448611/