Lvalue需要错误

时间:2013-08-13 13:14:19

标签: c ternary-operator lvalue

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);

为什么会这样?解释

3 个答案:

答案 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
}