visual studio不报告此程序的任何错误,而turbo c / c ++表示' Lvalue在函数main中需要'
int main()
{
int a=10,b;
a>=5?b=100:b=200;
printf("%d",b);
return 0;
}
避免错误:a> = 5? b = 100:(b = 200);
为什么会这样?解释
答案 0 :(得分:5)
在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中是不同的,虽然它看起来很相似!
答案 1 :(得分:1)
根据标准C语法,必须解析此三元表达式,就好像它是:
(a>=5?b=100:b)=200
解决方法是添加括号,就像您已经完成的那样,或者使用if语句,或者将表达式写为
b = a>=5? 100: 200;
C ++语言的语法规则略有不同,使得表达式按照您的预期进行解析。听起来像turbo c / c ++遵循C规则白色visual studio正在应用C ++规则。另见:Conditional operator differences between C and C++
答案 2 :(得分:1)
在第4行,您的代码a>=5?b=100:b=200;
是表达式的一半。
C tenernary运算符?:
产生左值表达式,即带有结果的表达式。
它可以被认为类似于函数返回,但在这种情况下不会以静默方式丢弃该值。
将?:
运算符视为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
}