2011-05-28 116 views
21

¿Por qué recibolvalue requerido como operador de la izquierda de la asignación

lvalue required as left operand of assignment 

con una sola comparación de cadenas? ¿Cómo puedo solucionar esto en C?

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

¡Gracias!

+0

posible duplicado de [ "lValue requiere como operador de la izquierda de la asignación de" error] (http://stackoverflow.com/questions/3050132/lvalue-required-as-left-operand-of-assignment-error) –

Respuesta

40

Es necesario comparar, no asigna:

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

Debido a que desea comprobar si el resultado de strcmp("hello", "hello") es igual a 0.

Sobre el error:

lvalue required as left operand of assignment

lvalue significa un valor asignable (variable), y en la asignación del valor a la izquierda = tiene que ser lvalue (muy claro).

Ambos resultados de la función y las constantes no son asignables (rvalue s), por lo que son rvalue s. por lo que el orden no importa y si olvida usar == obtendrá este error. (editar :) Considero que es una buena práctica en comparación con poner la constante en el tamaño de la izquierda, por lo que si escribe = en lugar de ==, obtendrá un error de compilación. por ejemplo:

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) 
{ 
    //... 
} 

(ver primera respuesta a esta pregunta: https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined)

+5

escribir al revés las comparaciones no son "buenas prácticas", es una abominación. Simplemente encienda las advertencias del compilador si necesita protección contra el uso accidental de '=' en lugar de '=='. En cualquier caso, esto es como andar en bicicleta con ruedas de entrenamiento o bolos con parachoques. Nadie sino principiantes debería necesitarlo. –

+1

@R. No estoy de acuerdo, hay errores tipográficos que podrían evitarse de esta manera. Y hay (muchas) veces donde el uso de '=' en la expresión es legítimo. – MByD

+0

Acepto que hay veces que es legítimo. Es por eso que sugerí habilitar la advertencia y usar paréntesis adicionales cuando realmente lo dices en serio. –

4

Cambio = a == es decir if (strcmp("hello", "hello") == 0)

Usted desea comparar el resultado de strcmp() a 0. Entonces usted necesita ==. Asignarlo a 0 no funcionará porque no se pueden asignar valores.

3

Usted está tratando de asignar un valor a una función, que no es posible en C. Prueba el operador de comparación en su lugar:

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

No se puede asignar un valor de lado derecho a un valor de lado derecho.

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

es incorrecto. Sugerencias:

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

= es la asignar operador.
== es el operador igual a.
Sé que muchos programadores nuevos se confunden con este hecho.

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

Está tratando de asignar 0 a la función return value que no es lvalue.

Los valores de devolución de función no son lvalue (no tienen almacenamiento), por lo que cualquier intento de asignar valor a algo que no sea lvalue dará como resultado un error.

La mejor práctica para evitar tales errores en las condiciones es usar el valor constante en el lado izquierdo de la comparación, así que incluso si usa "=" en lugar de "==", la constante no es lvalue dará error inmediatamente y evitará el valor accidental asignación y causar falsos positivos si la condición.

1

Encontré que una respuesta a este problema cuando se trata de matemáticas es que el operador en el lado izquierdo debe ser la variable que está tratando de cambiar. La lógica no puede ser lo primero.

coin1 + coin2 + coin3 = coinTotal; // Wrong 

coinTotal = coin1 + coin2 + coin3; // Right 

Esto no es una respuesta directa a su pregunta, pero podría ser útil para las personas que las futuras Google de la misma cosa que en Google.

Cuestiones relacionadas