2011-05-28 2 views
21

Pourquoi ai-jelvalue requis comme opérande gauche d'affectation

lvalue required as left operand of assignment 

avec une seule comparaison de chaînes? Comment puis-je résoudre ce problème dans C?

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

Merci!

+0

duplication possible de l'erreur ["lvalue required as left operand of assignment"] (http://stackoverflow.com/questions/3050132/lvalue-required-as-left-oper-of-assignment-error) –

Répondre

40

Vous devez comparer, pas Assign:

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

Parce que vous voulez vérifier si le résultat de strcmp("hello", "hello") est égal à 0.

A propos de l'erreur:

lvalue required as left operand of assignment

lvalue signifie une valeur assignable (variable), et dans l'attribution de la valeur de gauche à la = doit être lvalue (assez clair). Les résultats de la fonction et les constantes ne sont pas assignables (rvalue s), donc s. donc l'ordre n'a pas d'importance et si vous oubliez d'utiliser ==, vous obtiendrez cette erreur. (edit :) Je considère que une bonne pratique en comparaison de mettre la constante dans la taille de gauche, donc si vous écrivez = au lieu de ==, vous obtiendrez une erreur de compilation. par exemple:

int a = 5; 
if (a = 0) // Always evaluated as false, no error. 
{ 
    //... 
} 

contre

int a = 5; 
if (0 = a) // Generates compilation error, you cannot assign a to 0 (rvalue) 
{ 
    //... 
} 

(voir première réponse à cette question: https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined)

+5

Écriture en arrière les comparaisons ne sont pas «une bonne pratique», c'est une abomination. Activez simplement les avertissements du compilateur si vous avez besoin d'une protection contre l'utilisation accidentelle de '=' à la place de '=='. En tout cas, c'est comme faire du vélo avec des roues d'entraînement ou jouer au bowling avec des pare-chocs. Personne d'autre que les débutants ne devrait en avoir besoin. –

+1

@R. Je ne suis pas d'accord, il y a des fautes de frappe qui pourraient être évitées de cette façon. Et il y a (plusieurs) fois où l'utilisation de '=' dans l'expression est légitime. – MByD

+0

Je suis d'accord qu'il y a des fois c'est légitime. C'est pourquoi j'ai suggéré d'activer l'avertissement et d'utiliser des parenthèses supplémentaires quand vous le pensez vraiment. –

4

changement =-== -à-dire if (strcmp("hello", "hello") == 0)

Vous voulez comparer la résultat de strcmp() à 0. Vous avez donc besoin de ==. L'affecter à 0 ne fonctionnera pas car les valeurs ne peuvent pas être assignées.

3

Vous essayez d'attribuer une valeur à une fonction, ce qui est impossible dans C. Essayez l'opérateur de comparaison à la place:

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

Vous ne pouvez pas affecter un rvalue à un rvalue.

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

est faux. Suggestions:

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

= est le assign opérateur.
== est l'opérateur égal à.
Je sais que beaucoup de nouveaux programmeurs sont confondus avec ce fait.

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

Essaye d'affecter 0 à la fonction return value qui n'est pas lvalue.

Les valeurs de retour de fonction ne sont pas lvalue (pas de stockage pour cela), donc toute tentative d'affectation de valeur à quelque chose qui n'est pas lvalue entraîne une erreur. Meilleure pratique pour éviter de telles erreurs si les conditions sont d'utiliser une valeur constante sur le côté gauche de la comparaison, donc même si vous utilisez "=" au lieu de "==", la constante n'étant pas lvalue donnera immédiatement une erreur et évitera une valeur accidentelle affectation et provoquant faux positif si la condition.

1

J'ai trouvé qu'une réponse à ce problème en traitant des maths est que l'opérateur sur le côté gauche doit être la variable que vous essayez de changer. La logique ne peut pas venir en premier.

coin1 + coin2 + coin3 = coinTotal; // Wrong 

coinTotal = coin1 + coin2 + coin3; // Right 

Ce n'est pas une réponse directe à votre question, mais il pourrait être utile pour les personnes à venir qui Google la même chose que je googlé.

Questions connexes