¿Es (4 > y > 1) una declaración válida en C++? ¿Cómo lo evalúas si es así?
¿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 se evalúan los operadores lógicos encadenados?
La declaración (4 > y > 1)
se analiza así:
((4 > y) > 1)
Los operadores de comparación <
y >
evalúan de izquierda a derecha .
Los 4 > y
retornos son 0
o 1
dependiendo de si es cierto o no.
Luego el resultado se compara con 1.
En este caso, dado que 0
or 1
nunca es mayor que 1
, la declaración completa siempre devolverá false .
Sin embargo, hay una excepción:
Si y
es una clase y el >
operador ha sido sobrecargado para hacer algo inusual. Entonces todo vale.
Por ejemplo, esto no podrá 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 es, o puede convertirse implícitamente en, un número 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 regresar true
o false
. La siguiente parte efectivamente se convierte true > 1
en 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
se evalúa como falso. B) 4 > y
regresa false
. false
evalúa a 0
. 0 > 1
se evalúa como falso.
Pase lo que pase, la expresión se evaluará como falsa.
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 ( !
,, ) utilizan lógica &&
de ||
cortocircuito.
Dado a && b
, a
será evaluado. Si a
se evalúa como verdadero, entonces b
será evaluado. En caso contrario, b
no será evaluado . En cuanto a a || b
, la lógica de cortocircuito funciona a la inversa. a
será evaluado. Dado que la expresión a
se evalúa primero, si es falsa, no hay posibilidad de que toda la expresión se evalúe como verdadera.
Dado a || b
, a
será evaluado. Si a
se evalúa como falso, entonces b
será evaluado. En caso contrario, b
no será evaluado . Dado que la expresión a
se evalúa primero, si es verdadera, no hay posibilidad de que toda la expresión se evalúe como falsa.
Encadenar a los operadores es una cuestión de precedencia de operadores . Es mejor utilizar paréntesis y ser claro que arriesgarse a cometer un comportamiento incorrecto.
Creo que es una expresión válida (no una declaración), pero probablemente no haga lo que quieres. Evalúa de izquierda a derecha, como (4 > y) > 1
. La prueba 4 > y
se evaluará como 0 (falso) o 1 (verdadero), y la expresión completa siempre se evaluará como 0 (falso).