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:

erreur: l'expression doit être une valeur modifiable

<!-- 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:

if ( match == 0 )

c'est ok. Quelqu'un pourrait-il m'expliquer?

21
demandé sur Brian Tompsett - 汤莱恩 2012-10-05 15:45:57

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))
30
répondu Kerrek SB 2012-10-05 11:49:23

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.

11
répondu Alan 2015-04-17 14:20:57

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))

3
répondu tomahh 2012-10-05 11:48:23

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.

3
répondu Basile Starynkevitch 2012-10-05 11:57:30