需要左值做为赋值运算符的左操作数

24

为什么我会收到

lvalue required as left operand of assignment

如何通过单个字符串比较来解决这个问题?我该如何在C中修复它?

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

谢谢!


可能是["lvalue required as left operand of assignment " error]的重复问题。(https://dev59.com/Hk7Sa4cB1Zd3GeqP3nar) - Bo Persson
6个回答

47

你需要进行比较,而非赋值:

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

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

关于错误:

需要lvalue作为分配的左操作数

lvalue表示可分配值(变量),在赋值时,=的左值必须是lvalue(非常明显)。函数结果和常量均不可分配(rvalue),因此它们是rvalue。所以顺序无关紧要,如果你忘记使用==,就会出现这个错误。(编辑:)我认为与将常量放在左侧进行比较相比,这种做法很好,因此如果你写 =而不是==,就会得到一个编译错误。例如:

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


6
反向比较写法不是“好的实践”,而是一种丑恶行为。如果需要保护自己免受意外使用“=”代替“==”的影响,只需打开编译器警告即可。无论如何,这就像初学者骑着带有平衡轮的自行车或带有保险桶的保龄球游戏。除了初学者外,没有人应该需要这样做。 - R.. GitHub STOP HELPING ICE
1
@R. 我不同意,这种方式可以避免拼写错误。而且有很多时候,在表达式中使用 = 是合法的。 - MByD
我同意有时候这是合理的。这就是为什么我建议在你真正需要时启用警告并使用额外的括号。 - R.. GitHub STOP HELPING ICE

8
您不能将rvalue分配给rvalue。
if (strcmp("hello", "hello") = 0)

出错了。建议如下:

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

=赋值运算符。
==等于运算符。
我知道许多新手程序员对此感到困惑。


4

=改为==

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

你想要比较strcmp()的结果是否等于0。所以你需要用==。将其赋值为0是不起作用的,因为rvalues不能被赋值。


3
您正在尝试为函数分配一个值,在C语言中是不可能的。请改用比较运算符:
if (strcmp("hello", "hello") == 0)

1
我发现在处理数学时,解决这个问题的答案是左侧的运算符必须是你想要改变的变量。逻辑不能先行。
coin1 + coin2 + coin3 = coinTotal; // Wrong

coinTotal = coin1 + coin2 + coin3; // Right

这不是对你问题的直接回答,但它可能对未来搜索与我相同内容的人有所帮助。

我在以下这行代码中遇到了问题:data_ptr[data_len-1-i] = buffer[i]; - Eduardo Reis

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

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

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

在if条件中避免这种错误的最佳实践是在比较的左侧使用常量值,因此即使您使用“=”而不是“==”,常量不是左值也会立即给出错误并避免意外值分配并导致虚假的正面if条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接