为什么我
lvalue required as left operand of assignment
用单个字符串比较?如何在C
?
if (strcmp("hello", "hello") = 0)
谢谢!
答案 0 :(得分:42)
你需要比较,而不是分配:
if (strcmp("hello", "hello") == 0)
^
因为您想检查strcmp("hello", "hello")
的结果是否等于0
。
关于错误:
左值作为左操作数所需的左值 分配
lvalue
表示可分配的值(变量),在赋值时,=
的左值必须为lvalue
(非常清楚)。
函数结果和常量都不可分配(rvalue
s),因此它们是rvalue
s。因此顺序无关紧要,如果您忘记使用==
,您将收到此错误。 (编辑:)我认为这是一个很好的做法,相比之下,将常量放在左侧,所以如果你写=
而不是==
,你会得到一个编译错误。例如:
int a = 5;
if (a = 0) // Always evaluated as false, no error.
{
//...
}
VS
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)
答案 1 :(得分:7)
您无法为右值分配右值。
if (strcmp("hello", "hello") = 0)
错了。建议:
if (strcmp("hello", "hello") == 0)
^
=
是 assign 运算符
==
是等于运算符
我知道很多新程序员都对这个事实感到困惑。
答案 2 :(得分:4)
将=
更改为==
即
if (strcmp("hello", "hello") == 0)
您想将strcmp()
的结果与0进行比较。因此您需要==
。将其分配为0将不起作用,因为无法将rvalues分配给。
答案 3 :(得分:3)
您正在尝试为函数赋值,这在C中是不可能的。请尝试使用比较运算符:
if (strcmp("hello", "hello") == 0)
答案 4 :(得分:1)
我发现在处理数学时这个问题的答案是左侧的操作员必须是您要更改的变量。逻辑不能先行。
coin1 + coin2 + coin3 = coinTotal; // Wrong
coinTotal = coin1 + coin2 + coin3; // Right
这不是您问题的直接答案,但对于谷歌搜索我搜索的相同内容的未来人士可能会有所帮助。
答案 5 :(得分:0)
if (strcmp("hello", "hello") = 0)
尝试将0分配给函数返回值,该值不是左值。
函数返回值不是左值(没有存储空间),因此任何尝试将值赋给非左值的东西都会导致错误。
如果条件是在比较的左侧使用常数值,那么最好的做法是避免这样的错误,所以即使你使用" ="相反" ==",常量不是左值将立即给出错误并避免意外的值赋值并导致假阳性条件。