1

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

为什么会这样?解释。

4

3 回答 3

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 中是不同的,尽管它看起来很相似!

于 2013-08-13T13:19:29.880 回答
1

根据标准 C 语法,这个三元表达式必须被解析为:

 (a>=5?b=100:b)=200

解决方法是添加括号,就像您所做的那样,或者使用 if 语句,或者将表达式编写为

b = a>=5? 100: 200;

C++ 语言的语法规则略有不同,使表达式按您期望的方式进行解析。听起来 turbo c/c++ 正在遵循 C 规则白色 Visual Studio 正在应用 C++ 规则。另请参阅:C 和 C++ 之间的条件运算符差异

于 2013-08-13T13:20:41.460 回答
1

在第 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
}
于 2013-08-13T13:29:42.337 回答