Почему я получаю
lvalue required as left operand of assignment
с помощью сравнения одной строки? Как я могу исправить это в C
?
if (strcmp("hello", "hello") = 0)
Спасибо!
Почему я получаю
lvalue required as left operand of assignment
с помощью сравнения одной строки? Как я могу исправить это в C
?
if (strcmp("hello", "hello") = 0)
Спасибо!
Сравнивать нужно, а не присваивать:
if (strcmp("hello", "hello") == 0)
^
Потому что вы хотите проверить, равен ли результат strcmp("hello", "hello")
0
.
Об ошибке:
lvalue требуется как левый операнд присваивания
lvalue
означает присваиваемое значение (переменную), и при присвоении левое значение =
должно быть lvalue
(довольно ясно).
И результаты функции, и константы не могут быть назначены (rvalue
s), поэтому они равны rvalue
s. поэтому порядок не имеет значения, и если вы забудете использовать ==
, вы получите эту ошибку. (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 R.. GitHub STOP HELPING ICE; 28.05.2011
=
в выражении является законным.
- person MByD; 28.05.2011
Вы не можете присвоить rvalue rvalue.
if (strcmp("hello", "hello") = 0)
неправильно. Предложения:
if (strcmp("hello", "hello") == 0)
^
=
— это оператор назначения.==
— это оператор равно.
Я знаю, что многих начинающих программистов смущает этот факт.
Измените =
на ==
, т.е. if (strcmp("hello", "hello") == 0)
Вы хотите сравнить результат strcmp()
с 0. Итак, вам нужно ==
. Присвоение ему значения 0 не будет работать, потому что значения r не могут быть присвоены.
Вы пытаетесь присвоить значение функции, что невозможно в C. Вместо этого попробуйте использовать оператор сравнения:
if (strcmp("hello", "hello") == 0)
Я обнаружил, что ответ на этот вопрос при работе с математикой заключается в том, что оператор в левой части должен быть переменной, которую вы пытаетесь изменить. Логика не может стоять на первом месте.
coin1 + coin2 + coin3 = coinTotal; // Wrong
coinTotal = coin1 + coin2 + coin3; // Right
Это не прямой ответ на ваш вопрос, но он может быть полезен будущим людям, которые будут гуглить то же самое, что и я.
if (strcmp("hello", "hello") = 0)
Пытается присвоить 0 возвращаемому значением функции, которое не является lvalue.
Возвращаемые значения функции не являются lvalue (для него нет хранилища), поэтому любая попытка присвоить значение чему-то, что не является lvalue, приводит к ошибке.
Лучшей практикой во избежание таких ошибок в условиях if является использование постоянного значения в левой части сравнения, поэтому даже если вы используете «=» вместо «==», константа, не являющаяся lvalue, немедленно выдаст ошибку и предотвратит случайное присвоение значения и вызовет false положительный если состояние.