web-dev-qa-db-fra.com

L'expression doit être une valeur modifiable

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?

23
E_learner

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))
31
Kerrek SB

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.

16
Alan

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.

3

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

3
tomahh