Visual Studio 未报告此程序的任何错误,而 turbo c/c++ 说“函数 main 中需要左值”
int main()
{
int a=10,b;
a>=5?b=100:b=200;
printf("%d",b);
return 0;
}
避免错误:a>=5?b=100 :(b=200);
为什么会这样?解释。
Visual Studio 未报告此程序的任何错误,而 turbo c/c++ 说“函数 main 中需要左值”
int main()
{
int a=10,b;
a>=5?b=100:b=200;
printf("%d",b);
return 0;
}
避免错误:a>=5?b=100 :(b=200);
为什么会这样?解释。
在 C++ 中,三元条件运算符将赋值表达式作为第三个操作数,因此您的表达式被理解为:
(a >= 5 ? b = 100 : b) = 200;
在“真实”情况下,这相当于:
b = 100 = 200;
这反过来从右到左分组,即:
b = (100 = 200);
这显然没有意义。
你想说的是:
if (a >= 5) { b = 100; } else { b = 200; }
你不需要表达;声明完全没问题。或者,正如米歇尔建议的那样:
int b = a >= 5 ? 100 : 200;
请注意,三元条件运算符在 C 中是不同的,尽管它看起来很相似!
根据标准 C 语法,这个三元表达式必须被解析为:
(a>=5?b=100:b)=200
解决方法是添加括号,就像您所做的那样,或者使用 if 语句,或者将表达式编写为
b = a>=5? 100: 200;
C++ 语言的语法规则略有不同,使表达式按您期望的方式进行解析。听起来 turbo c/c++ 正在遵循 C 规则白色 Visual Studio 正在应用 C++ 规则。另请参阅:C 和 C++ 之间的条件运算符差异
在第 4 行,您的代码a>=5?b=100:b=200;
是半个表达式。
C 三元运算符?:
产生一个左值表达式,即一个带有结果的表达式。它可以被认为类似于函数返回,但在这种情况下,该值不会被默默地丢弃。
?:
将操作符想象为在result = if(test evaluates to true)then this else that
哪里then
并且是?
else
:
因此,您应该将该行重写为b = (a>=5)?100:200;
或
if (a >=5) //test
{ //'?'
b = 100;
}
else
{ //':'
b = 200
}