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.