【问题标题】:Lvalue required Error需要左值 错误
【发布时间】:2013-08-15 03:07:51
【问题描述】:

当 turbo c/c++ 说“函数 main 中需要左值”时,Visual Studio 没有报告此程序的任何错误

int main()
{
  int a=10,b; 
  a>=5?b=100:b=200;
  printf("%d",b);
  return 0;

}

为了避免错误:a>=5 ? b=100 :(b=200);

为什么会这样?解释一下。

【问题讨论】:

  • 有一个很好解释的答案,但为了可读性,我建议您将其更改为b = (a>=5?100:200);

标签: c ternary-operator lvalue


【解决方案1】:

在 C++ 中,三元条件运算符将 assignment-expression 作为第三个操作数,因此您的表达式被理解为:

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

在“真实”的情况下,这相当于:

b = 100 = 200;

这反过来从右到左分组,即:

b = (100 = 200);

这显然没有意义。


你的意思是:

if (a >= 5) { b = 100; } else { b = 200; }

你不需要表达;声明完全没问题。或者,正如 Michelle 建议的那样:

int b = a >= 5 ? 100 : 200;

请注意,三元条件运算符在 C 中是不同的,虽然看起来很相似!

【讨论】:

  • @DrewMcGowen:这取决于您对编译器的期望。 Visual Studio 说自己的方言,这不是真正正确的 C++...
【解决方案2】:

根据标准 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++

【讨论】:

    【解决方案3】:

    在第 4 行,您的代码 a>=5?b=100:b=200; 是半个表达式

    C 三元运算符?: 产生一个lvalue 表达式,即一个带有结果的表达式。 可以认为它类似于函数返回,但在这种情况下,该值不会被静默丢弃。

    ?: 运算符视为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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2011-03-04
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多