2012-10-05 90 views
17

tengo este código siguiente:expresión debe ser un valor-modificable

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; 
    } 
} 

pero le da un vistazo a un error que dice:

Error: expression must be a modifiable value

en esa línea "si". No estoy tratando de modificar el valor de "coincidencia" o "k" aquí, pero ¿por qué este error? si solo lo escribo como:

if (match == 0) 

está bien. ¿Alguien podría explicarme?

+7

¿Querías 'k == M'? –

+1

'K == M' no' K = M' – Shashwat

+3

¡Tiene suerte de que haya un error de compilación debido a las precedencias de operador de '&&' y '=', en lugar de generar silenciosamente un programa incorrecto! – Rufflewind

Respuesta

29

El operador de asignación tiene menor prioridad que &&, por lo que su condición es equivalente a:

if ((match == 0 && k) = m) 

Pero el lado izquierdo de esto es un valor r, es decir, el booleano resultante de la evaluación de la expresión ­ sub match == 0 && k, por lo que no puede asignarlo.

Por el contrario, la comparación tiene mayor prioridad, por lo match == 0 && k == m es equivalente a:

if ((match == 0) && (k == m)) 
3

Recuerde que un solo = es siempre una asignación en C o C++.

Tu prueba debería ser if (match == 0 && k == M) hiciste un error tipográfico en la prueba k == M.

Si realmente quiere decir k=M (es decir, una asignación de efectos secundarios dentro de una prueba) debe por razones de legibilidad el código if (match == 0 && (k=m) != 0) pero la mayoría de las reglas de codificación aconsejan no escribir eso.

Por cierto, su error sugiere solicitar todas las advertencias (por ejemplo, -Wall opción a g++), y actualizar a compiladores recientes. El siguiente GCC 4.8 le dará:

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

y Clang 3.1 también le dice ederman.cc:9:30: error: expression is not assignable

lo tanto, utilizar las últimas versiones de compiladores libres y ayudar a todas las advertencias al utilizarlos.

2

Prueba k = M en lugar de k == M.
Tal vez es lo que quiere hacer, en este caso, escribir if (match == 0 && (k = M))

9

En C, también experimentar el mismo error si declara una:

char array[size]; 

y de tratar para asignar un valor sin especificar una posición de índice:

array = '\0'; 

Haciendo:

array[index] = '0\'; 

Está especificando la dirección accesible/modificable previamente declarada.

Cuestiones relacionadas