3.7.10. Trampas habituales cuando se usan operadores

Como se ha ilustrado anteriormente, una de las trampas al usar operadores es tratar de trabajar sin paréntesis incluso cuando no se está seguro de la forma en la que se va a evaluar la expresión (consulte su propio manual de C para comprobar el orden de la evaluación de las expresiones).

Otro error extremadamente común se ve a continuación:

//: C03:Pitfall.cpp
// Operator mistakes

int main() {
  int a = 1, b = 1;
  while(a = b) {
    // ....
  }
} ///:~

Listado 3.36. C03/Pitfall.cpp


La sentencia a = b siempre se va a evaluar como cierta cuando b es distinta de cero. La variable a obtiene el valor de b, y el valor de b también es producido por el operador =. En general, lo que se pretende es utilizar el operador de equivalencia (== dentro de una sentencia condicional, no la asignación. Esto le ocurre a muchos programadores (de todos modos, algunos compiladores advierten del problema, lo cual es una ayuda).

Un problema similar es usar los operadores and y or de bits en lugar de sus equivalentes lógicos. Los operadores and y or de bits usan uno de los caracteres (& o |), mientras que los operadores lógicos utilizan dos (&& y ||). Al igual que con = y ==, es fácil escribir simplemente un carácter en vez de dos. Una forma muy fácil de recordarlo es que «los bits son mas pequeños, de modo que no necesitan tantos caracteres en sus operadores».