【问题标题】:lvalue required as left operand of assignment左值需要作为赋值的左操作数
【发布时间】:2011-09-03 23:34:02
【问题描述】:

我为什么会得到

lvalue required as left operand of assignment

使用单个字符串比较?如何在C 中解决此问题?

if (strcmp("hello", "hello") = 0)

谢谢!

【问题讨论】:

标签: c lvalue strcmp


【解决方案1】:

你需要比较,而不是分配:

if (strcmp("hello", "hello") == 0)
                             ^

因为你想检查strcmp("hello", "hello")的结果是否等于0

关于错误:

需要左值作为左操作数 作业

lvalue 表示可分配的值(变量),在分配给= 的左侧值必须是lvalue(很清楚)。

函数结果和常量都不可赋值(rvalues),所以它们是rvalues。所以顺序无关紧要,如果您忘记使用==,您将收到此错误。 (编辑:)我认为将常量放在左侧比较好,所以如果你写=而不是==,你会得到一个编译错误。例如:

int a = 5;
if (a = 0) // Always evaluated as false, no error.
{
    //...
}

对比

int a = 5;
if (0 = a) // Generates compilation error, you cannot assign a to 0 (rvalue)
{
    //...
}

(请参阅此问题的第一个答案:https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

【讨论】:

  • 写反向比较不是“一个好习惯”,它是可憎的。如果您需要防止意外使用= 代替==,只需打开编译器警告即可。无论如何,这就像骑带辅助轮的自行车或带保险杠的保龄球一样。除了初学者,没有人需要它。
  • @R。我不同意,有些错别字可以通过这种方式避免。并且有(很多)次在表达式中使用= 是合法的。
  • 我同意有时它是合法的。这就是为什么我建议启用警告并在您真正想要的时候使用额外的括号。
【解决方案2】:

您不能将右值分配给右值。

if (strcmp("hello", "hello") = 0)

错了。建议:

if (strcmp("hello", "hello") == 0)
                              ^

=assign 运算符。
==等于 运算符。
我知道许多新程序员对这个事实感到困惑。

【讨论】:

    【解决方案3】:

    = 更改为== IE if (strcmp("hello", "hello") == 0)

    您想将strcmp() 的结果与0 进行比较。所以您需要==。将其分配给 0 将不起作用,因为无法分配右值。

    【讨论】:

      【解决方案4】:

      您正在尝试为函数赋值,这在 C 中是不可能的。请尝试使用比较运算符:

      if (strcmp("hello", "hello") == 0)
      

      【讨论】:

        【解决方案5】:

        我发现在处理数学时,这个问题的答案是左侧的运算符必须是您要更改的变量。逻辑不能放在第一位。

        coin1 + coin2 + coin3 = coinTotal; // Wrong
        
        coinTotal = coin1 + coin2 + coin3; // Right
        

        这不是对您问题的直接答案,但它可能对将来使用我搜索过的相同内容的人有所帮助。

        【讨论】:

          【解决方案6】:
          if (strcmp("hello", "hello") = 0)
          

          正在尝试将 0 分配给不是左值的函数返回值。

          函数返回值不是左值(没有存储空间),因此任何将值分配给非左值的尝试都会导致错误。

          在 if 条件中避免此类错误的最佳做法是在比较左侧使用常量值,因此即使使用“=”代替“==”,常量不是左值也会立即出错并避免意外赋值并导致假阳性 if 条件。

          【讨论】:

            猜你喜欢
            • 2018-10-19
            • 1970-01-01
            • 1970-01-01
            • 2013-01-27
            相关资源
            最近更新 更多