L'Expression doit être une valeur modifiable
j'ai le 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 il donne une erreur en disant:
<!-- 2 sur la ligne" si". Je n'essaie pas de modifier la valeur "match" ou "k" ici, mais pourquoi cette erreur? si je ne l'écrire comme ceci:erreur: l'expression doit être une valeur modifiable
if ( match == 0 )
c'est ok. Quelqu'un pourrait-il m'expliquer?
4 réponses
l'opérateur de tâche a une priorité plus faible que &&
, si votre état est équivalent à:
if ((match == 0 && k) = m)
Mais le côté gauche, c'est une rvalue, à savoir le booléen résultant de l'évaluation de la sous-expression match == 0 && k
, donc vous ne pouvez pas lui assigner.
par contraste, la comparaison a une plus grande priorité, donc match == 0 && k == m
est l'équivalent de:
if ((match == 0) && (k == m))
En C, vous pouvez également rencontrer le même message d'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 = '';
En faisant:
array[index] = '0\';
vous spécifiez l'adresse accessible/modifiable précédemment déclarée.
vous testez k = M
au lieu de k == M
.
C'est peut-être ce que vous voulez faire, dans ce cas, écrire if (match == 0 && (k = M))
Rappelez-vous qu'un seul =
est toujours une tâche en C ou c++.
votre test devrait être if ( match == 0 && k == M )
vous avez fait une faute de frappe sur le k == M
de test.
Si vraiment tu veux dire k=M
(c'est à dire d'un côté-effectuer l'affectation à l'intérieur d'un test de), vous devez, pour des raisons de lisibilité de code if (match == 0 && (k=m) != 0)
mais la plupart des règles de codage conseillent de ne pas écrire cela.
BTW, ton erreur suggère de demander à tous les avertissements (par exemple,-Wall
option g++
), et de mettre à niveau vers des compilateurs récents. Le 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 libres et activez toutes les mises en garde lors de leur utilisation.