lvalue требуется как левый операнд присваивания - PullRequest
22 голосов
/ 28 мая 2011

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

lvalue required as left operand of assignment

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

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

Спасибо!

Ответы [ 6 ]

43 голосов
/ 28 мая 2011

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

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

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

Об ошибке:

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

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

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

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)

7 голосов
/ 06 сентября 2015

Вы не можете назначить значение r для значения.

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

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

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

= - это оператор assign .
== - это оператор , равный .
Я знаю много новогопрограммисты смущены этим фактом.

4 голосов
/ 28 мая 2011

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

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

3 голосов
/ 28 мая 2011

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

if (strcmp("hello", "hello") == 0)
1 голос
/ 07 февраля 2018

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

coin1 + coin2 + coin3 = coinTotal; // Wrong

coinTotal = coin1 + coin2 + coin3; // Right

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

0 голосов
/ 17 декабря 2017
if (strcmp("hello", "hello") = 0)

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

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

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

...