Académique Documents
Professionnel Documents
Culture Documents
eran: == operador de igualdad en C != operador de desigualdad > mayor < menor >= mayor o igual <= menor o igual Con estos se pueden construir expresiones sencillas como: numero <= 7, dependiendo del valor de la variable numero esa expresin puede ser verdadera o falsa. Este tipo de expresiones se utilizan para las condiciones en las estructuras de repeticin y de seleccin.
1 Sinopsis
Los operadores lgicos producen un resultado booleano, ( 3.2.1b), y sus operandos son tambin valores lgicos o asimilables a ellos (los valores numricos son asimilados a cierto o falsosegn su valor sea cero o distinto de cero). Por contra, recuerde que las operaciones entre bits ( 4.9.3) producen valores arbitrarios.
Los operadores lgicos son tres; dos de ellos son binarios, el ltimo (negacin) es unario. Tienen una doble posibilidad de representacin en el Estndar C++ actual: la representacin tradicional que se indica a continuacin, y la natural introducida recientemente que se detalla ms adelante .
AND OR
Las expresiones conectadas con los operadores && y || se evalan de izquierda a derecha, y la evaluacin se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una lgica que se basa en este propiedad).
2 &&
Operador Y lgico
Tambin denominado por su nombre en ingls (generalmente en maysculas) AND lgico. Devuelve un valor lgico true si ambos operandos son ciertos. En caso contrario el resultado es false.
Sintaxis
expr-AND-logica && expresion-OR-inclusive Comentario: La operatoria es como sigue: El primer operando (de la izquierda) es convertido a bool. Para ello, si es una expresin, se evala para obtener el resultado (esta computacin puede tener ciertos efectos laterales). A continuacin, el valor obtenido es convertido a bool cierto/falso siguiendo las reglas de conversin estndar ( 3.2.1b). Si el resultado es false, el proceso se detiene y este es el resultado, sin que en este caso sea necesario evaluar la expresin de la derecha (recurdese que en el diseo de C++ prima la velocidad). Si el resultado del operando izquierdo es cierto, se contina con la evaluacin de la expresin de la derecha, que tambin es convertida a bool. Si el nuevo resultado es true, entonces el resultado del operador es true. En caso contrario el resultado es false. Nota: la Norma informa que antes de ser evaluada la expresin derecha, han sucedido todos los posibles efectos laterales de la expresin izquierda, a excepcin de la destruccin de los posibles objetos temporales que se hubiesen creado. Ejemplo: int m[3] = {0,1,2}; int x = 0; if (m && x) cout << "Cierto."; else cout << "Falso."; Salida: Falso. El valor m, que es interpretado como un puntero al primer elemento de la matriz, es transformado a un bool. Como es distinto de cero (no es un puntero nulo) el resultado es cierto. A continuacin, el valor x es convertido tambin a bool. En este caso la conversin produce falso, con lo que este es el resultado del parntesis de la sentencia if. Ejemplo #include <iostream.h> bool alto = true, bajo = false, blanco = true, negro = false; int main (void) { if (alto && bajo) { cout << "Uno cierto" << endl; } else cout << "Uno falso" << endl; if (alto && blanco) { cout << "Dos cierto" << endl; } else cout << "Dos falso" << endl; if (bajo && negro) { cout << "Tres cierto" << endl; } else cout << "Tres falso" << endl; } Salida: Uno falso Dos cierto Tres falso
3 ||
Operador O lgico
Este operador binario devuelve true si alguno de los operandos es cierto. En caso contrario devuelve false.
Sintaxis
expr-OR-logica || expresion-AND-logica Comentario Este operador sigue un funcionamiento anlogo al anterior. El primer operando (izquierdo) es convertido a bool. Para ello, si es una expresin, se evala para obtener el resultado (esta computacin puede tener ciertos efectos laterales). A continuacin el valor obtenido es convertido a bool cierto/falso siguiendo las reglas de conversin estndar ( 3.2.1b). Si el resultado estrue, el proceso se detiene y este es el resultado, sin que en este caso sea necesario evaluar la expresin de la derecha (recurdese que en el diseo de C++ prima la velocidad). Si el resultado del operando izquierdo es false, se contina con la evaluacin de la expresin de la derecha, que tambin es convertida a bool. Si el nuevo resultado es true, entonces el resultado del operador es true. En caso contrario el resultado es false. Nota: el Estndar establece que antes de ser evaluada la expresin derecha, han sucedido todos los posibles efectos laterales de la expresin izquierda, a excepcin de la destruccin de los posibles objetos temporales que se hubieran creado. Ejemplo #include <iostream.h> bool alto = true, bajo = false, blanco = true, negro = false; int main (void) { if (alto || bajo) { cout << "Uno cierto" << endl; } else cout << "Uno falso" << endl; if (alto || blanco) { cout << "Dos cierto" << endl; } else cout << "Dos falso" << endl; if (bajo || negro) { cout << "Tres cierto" << endl; } else cout << "Tres falso" << endl; } Salida Uno cierto Dos cierto Tres falso
4 !
Operador NO lgico:
Este operador es denominado tambin negacin lgica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el cdigo).
Sintaxis
! expresion-cast Comentario
El operando expresion-cast (que puede ser una expresin que se evala a un resultado 1.2.1) es convertido a tipo bool, con lo que solo puede ser uno de los valores cierto/falso. A continuacin el operador cambia su valor: Si es cierto es convertido a falso y viceversa. Resulta por tanto, que el resultado de este operador es siempre un tipo bool, aunque al existir una conversin estndar por la que un cero es convertido a false, y cualquier valor distinto de cero atrue ( 3.2.1b), coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0. En otras palabras: este operador devuelve cierto (true) si la expresin se evala a distinto de cero, en caso contrario devuelve falso (false).
Ejemplo #include <iostream.h> bool alto = true, bajo = false; int main (void) { if (alto) { cout << "Uno cierto" << endl; } else cout << "Uno falso" << endl; if (!alto) { cout << "Dos cierto" << endl; } else cout << "Dos falso" << endl; if (!bajo) { cout << "Tres cierto" << endl; } else cout << "Tres falso" << endl; } Salida: Uno cierto Dos falso Tres cierto
Si E es una expresin, !E es equivalente a (0 == E). Como consecuencia, las expresiones que siguen son equivalentes dos a dos: if (! valid); if (valid == 0); ... if (valid); if (valid != 0);
7 Representacin explcita
Los operadores lgicos entre valores lgicos &&, ||, !; la relacin de desigualdad !=; algunos de los operadores lgicos entre bits (&, |, ^, ~) y sus expresiones compuestas (&=, |=, ^=), tienen una representacin realmente difcil de leer, con la desventaja adicional que sus smbolos no siempre estn fcilmente accesibles en ordenadores con teclados distintos del estndar USA. Para resolver este problema, el Estndar C++ ha introducido nuevas formas para su representacin; las denominamos formas explcitas o naturales, en razn de que se parecen ms a las palabras correspondientes del lenguaje natural. Las nuevas formas constituyen palabras-clave, y la tabla de equivalencias es la siguiente:
Palabra Smbolo Referencia clave and && or || not ! bitand & 4.9.3 xor bitor compl and_eq xor_eq or_eq ^ | ~ &= ^= |= 4.9.3 4.9.3 4.9.3 4.9.3 4.9.3 4.9.3
Descripcin Operador Y lgico Operador O lgico Operador negacin lgica Operador AND entre bits Operador OR exclusivo entre bits Operador OR inclusivo entre bits Operador complemento a uno de bits Asignacin compuesta (AND entre bits) Asignacin compuesta (XOR entre bits) Asignacin compuesta (OR entre bits)
not_eq
!=
4.9.12
Nota: ni el compilador Borland C++ 5.5 ni MS VC++ 6.0 soportan esta caracterstica del estndar, aunque el de Microsoft anuncia en su documentacin que pueden utilizarse "defines" ( #define #define #define #define #define bitand & bitor | and_eq &= or_eq |= not_eq != 4.9.10b). Por ejemplo:
Por su parte, el compilador GNU gcc dispone de la opcin de compilacin -fno-operator-names, que permite que las palabras-clave and, bitand, bitor, compl, not, y or, no sean tratadas como sinnimos de los operadores correspondientes.