operator cplusplus bitwise and c++ if-statement conditional boolean-logic logical-operators

bitwise - if c++ cplusplus



¿Es(4> y> 1) una declaración válida en C++? ¿Cómo lo evalúas si es así? (4)

¿Es esa una expresión válida? Si es así, ¿puedes reescribirlo para que tenga más sentido? Por ejemplo, ¿es lo mismo que (4 > y && y > 1) ? ¿Cómo evalúa operadores lógicos encadenados?


4> y evaluará a un valor booleano de verdadero o falso. El resto de la expresión es esencialmente [verdadero | falso]> 1, lo cual no tiene sentido.


Creo que es una declaración válida, pero probablemente no hace lo que quieres. Se evalúa de izquierda a derecha, como (4 > y) > 1 . La prueba 4 > y evaluará a 0 (falso) o 1 (verdadero), y la expresión completa siempre evaluará a 0 (falso).


La instrucción (4 > y > 1) se analiza como esta:

((4 > y) > 1)

Los operadores de comparación < y > evalúan de izquierda a derecha .

El 4 > y devuelve 0 o 1 dependiendo de si es verdadero o no.

Entonces el resultado se compara con 1.

En este caso, dado que 0 o 1 nunca es más de 1 , la instrucción completa siempre devolverá falsa .

Sin embargo, hay una excepción:

Si y es una clase y el operador > se ha sobrecargado para hacer algo inusual. Entonces todo vale.

Por ejemplo, esto no se compilará:

class mytype{ }; mytype operator>(int x,const mytype &y){ return mytype(); } int main(){ mytype y; cout << (4 > y > 1) << endl; return 0; }


Validez de expresión

Sí, es una expresión válida, suponiendo que y se puede convertir implícitamente en un entero. Si no es así y el operador > está sobrecargado, es una historia diferente fuera del alcance de esta pregunta.

Se evaluará de izquierda a derecha como ((4 > y) > 1) .

Suponiendo que y es un número entero, consideremos las dos posibilidades. 4 > y puede devolver true o false . La siguiente parte pasa a ser true > 1 o false > 1 .

Dada la conversión implícita de bool a int , hay dos posibilidades: A) 4 > y devuelve true . true evalúa a 1 . 1 > 1 evalúa a falso. B) 4 > y devuelve false . false evalúa a 0 . 0 > 1 evalúa a falso.

No importa qué, la expresión evaluará a falso.

Interpretación reescrita

Supongo que lo que pretendes es ((4 > y) && (y > 1)) .

Ejemplo

(4 > y > 1) no es lo mismo que (4 > y && y > 1) .

Operadores logicos

Los operadores lógicos ( ! , && , || ) usan lógica de cortocircuito.

Dado a && b , a será evaluado. Si a evalúa como verdadero, entonces se evaluará b . De lo contrario, b no será evaluado . En cuanto a a || b a || b , la lógica de cortocircuito funciona a la inversa. a será evaluado. Como la expresión a se evalúa primero, si es falsa, no hay posibilidad de que toda la expresión evalúe verdadera.

Dado a || b a || b , a será evaluado. Si a evalúa como falso, entonces se evaluará b . De lo contrario, b no será evaluado . Como la expresión a se evalúa primero, si es verdadera, no hay posibilidad de que toda la expresión evalúe falsa.

Encadenar a los operadores es una cuestión de precedencia del operador . Es mejor usar paréntesis y ser claro en lugar de arriesgar el comportamiento incorrecto.