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!
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!
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)
É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. –
@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
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. –
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.
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)
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.
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.
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é.
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) –