J'ai ce code suivant:
int M = 3;
int C = 5;
int match = 3;
for ( int k =0; k < C; k ++ )
{
match --;
if ( match == 0 && k = M )
{
std::cout << " equals" << std::endl;
}
}
Mais cela donne une erreur en disant:
Erreur: l'expression doit être une valeur modifiable
sur cette ligne "if". Je ne cherche pas à modifier la valeur "match" ou "k" ici, mais pourquoi cette erreur? si je l'écris seulement comme:
if ( match == 0 )
c'est bon. Quelqu'un pourrait-il me l'expliquer?
L'opérateur d'affectation a une priorité inférieure à &&
, votre condition équivaut à:
if ((match == 0 && k) = m)
Mais la partie gauche est une valeur, à savoir le booléen résultant de l'évaluation de la sous-expression match == 0 && k
, vous ne pouvez donc pas l’affecter.
En revanche, la comparaison a une priorité supérieure, donc match == 0 && k == m
est équivalent à:
if ((match == 0) && (k == m))
En C, vous rencontrerez également la même erreur si vous déclarez un:
char array[size];
et que d'essayer d'attribuer une valeur sans spécifier une position d'index:
array = '\0';
En faisant:
array[index] = '0\';
Vous spécifiez l'adresse accessible/modifiable précédemment déclarée.
Rappelez-vous qu'un seul =
Est toujours une affectation en C ou C++.
Votre test devrait être if ( match == 0 && k == M )
vous avez fait une faute de frappe sur le test k == M
.
Si vous voulez vraiment dire k=M
(C'est-à-dire une affectation ayant des effets secondaires dans un test), vous devriez le code if (match == 0 && (k=m) != 0)
pour des raisons de lisibilité, mais la plupart des règles de codage conseillent de ne pas l'écrire.
En passant, votre erreur suggère de demander tous les avertissements (par exemple, l'option -Wall
À g++
), Et de passer aux compilateurs récents. Le prochain GCC 4.8 vous donnera:
% g++-trunk -Wall -c ederman.cc
ederman.cc: In function ‘void foo()’:
ederman.cc:9:30: error: lvalue required as left operand of assignment
if ( match == 0 && k = M )
^
et Clang 3.1 vous dit aussi ederman.cc:9:30: error: expression is not assignable
Utilisez donc les versions récentes des compilateurs gratuits et activez tous les avertissements lors de leur utilisation.
Vous testez k = M
Au lieu de k == M
.
C’est peut-être ce que vous voulez faire. Dans ce cas, écrivez if (match == 0 && (k = M))