lvalue требуется как левый операнд присваивания

Почему я получаю

lvalue required as left operand of assignment

с помощью сравнения одной строки? Как я могу исправить это в C?

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

Спасибо!


person Joseph    schedule 28.05.2011    source источник
comment
возможный дубликат lvalue требуется в качестве левого операнда ошибки присваивания   -  person Bo Persson    schedule 28.05.2011


Ответы (6)


Сравнивать нужно, а не присваивать:

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

Потому что вы хотите проверить, равен ли результат strcmp("hello", "hello") 0.

Об ошибке:

lvalue требуется как левый операнд присваивания

lvalue означает присваиваемое значение (переменную), и при присвоении левое значение = должно быть lvalue (довольно ясно).

И результаты функции, и константы не могут быть назначены (rvalues), поэтому они равны rvalues. поэтому порядок не имеет значения, и если вы забудете использовать ==, вы получите эту ошибку. (edit:)Я считаю хорошей практикой по сравнению с размещением константы слева, поэтому, если вы напишете = вместо ==, вы получите ошибку компиляции. Например:

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)

person MByD    schedule 28.05.2011
comment
Написание обратных сравнений не является хорошей практикой, это мерзость. Просто включите предупреждения компилятора, если вам нужна защита от случайного использования = вместо ==. В любом случае это похоже на езду на велосипеде с тренировочными колесами или боулинг с бамперами. Никому, кроме новичков, это не нужно. - person R.. GitHub STOP HELPING ICE; 28.05.2011
comment
@Р. Я не согласен, есть опечатки, которых можно было бы избежать таким образом. И есть (много) случаев, когда использование = в выражении является законным. - person MByD; 28.05.2011
comment
Я согласен, что иногда это законно. Вот почему я предложил включить предупреждение и использовать дополнительные скобки, когда вы действительно этого хотите. - person R.. GitHub STOP HELPING ICE; 28.05.2011

Вы не можете присвоить rvalue rvalue.

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

неправильно. Предложения:

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

= — это оператор назначения.
== — это оператор равно.
Я знаю, что многих начинающих программистов смущает этот факт.

person EKons    schedule 06.09.2015

Измените = на ==, т.е. if (strcmp("hello", "hello") == 0)

Вы хотите сравнить результат strcmp() с 0. Итак, вам нужно ==. Присвоение ему значения 0 не будет работать, потому что значения r не могут быть присвоены.

person Prasoon Saurav    schedule 28.05.2011

Вы пытаетесь присвоить значение функции, что невозможно в C. Вместо этого попробуйте использовать оператор сравнения:

if (strcmp("hello", "hello") == 0)
person Community    schedule 28.05.2011

Я обнаружил, что ответ на этот вопрос при работе с математикой заключается в том, что оператор в левой части должен быть переменной, которую вы пытаетесь изменить. Логика не может стоять на первом месте.

coin1 + coin2 + coin3 = coinTotal; // Wrong

coinTotal = coin1 + coin2 + coin3; // Right

Это не прямой ответ на ваш вопрос, но он может быть полезен будущим людям, которые будут гуглить то же самое, что и я.

person Thomas    schedule 06.02.2018

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

Пытается присвоить 0 возвращаемому значением функции, которое не является lvalue.

Возвращаемые значения функции не являются lvalue (для него нет хранилища), поэтому любая попытка присвоить значение чему-то, что не является lvalue, приводит к ошибке.

Лучшей практикой во избежание таких ошибок в условиях if является использование постоянного значения в левой части сравнения, поэтому даже если вы используете «=» вместо «==», константа, не являющаяся lvalue, немедленно выдаст ошибку и предотвратит случайное присвоение значения и вызовет false положительный если состояние.

person Parshuram Thombare    schedule 17.12.2017