2011-03-29 20 views
31

Cuando intento compilar el trozo de código de abajo, me sale esta advertencia:advertencia del compilador - sugieren paréntesis alrededor de asignación utilizados como valor de verdad

warning: suggest parentheses around assignment used as truth value

¿Por qué sucede esto? Esta es una expresión bastante común, creo. Incluso uso algo así antes en mi código.

struct PIDList* 
getRecordForPID(struct PIDList* list, pid_t pid) { 
    while(list = list->next) 
     if (list->pid == pid) 
      return list; 

    return NULL; 
} 

Gracias

EDIT: Gracias por sus respuestas. Todos son muy similares, así que aceptaré uno al azar refrescando la página y haciendo clic en el que está en la parte superior :P

+0

Eres libre de desactivar la advertencia, o más bien dejar fuera ya que es desactivado por defecto ... Estoy –

+3

tipo de distraído, así que estoy agradecido por pedantic, -Wall, -Wextra, -Wshadow y similares –

+2

Bueno, usted puede agregar '-Wno-parentheses' (creo que es la correcta) para desactivar esta advertencia específica. Sin embargo, si es tan distraído, tenga cuidado de no escribir '=' en lugar de '==' ... –

Respuesta

52

Sea explícito, entonces el compilador no advertirá que quizás haya cometido un error.

while ((list = list->next) != NULL) 

o

while ((list = list->next)) 

Algún día se le alegra el compilador le ha dicho, las personas hacen cometer el mismo error;)

+0

¡La gente lo hace! Por esta misma razón, solía escribir 'if (0 == varName)' en C, para poder obtener un mensaje de error si lo escribía mal. – jpaugh

17

Es sólo una advertencia de 'seguridad'. Es un modismo relativamente común, pero también un error relativamente común cuando intentaste tener == allí. Puede tomar la advertencia desaparece mediante la adición de otro conjunto de paréntesis:

while ((list = list->next)) 
+4

+1 para una solución sin '! = 0' o'! = NULL' en ella. :-) –

45

Si bien ese idioma en particular es común, incluso más común es que la gente use = cuando quieren decir ==. La convención cuando en realidad significan la = es utilizar una capa adicional de paréntesis:

while ((list = list->next)) { // yes, it's an assignment 
+3

Esta respuesta es mucho más clara para mí que la aceptada, agradable. – gsamaras

Cuestiones relacionadas