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

Resuelto trusktr asked hace 12 años • 5 respuestas

¿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?

trusktr avatar Jan 17 '12 11:01 trusktr
Aceptado

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 > yretornos son 0o 1dependiendo de si es cierto o no.

Luego el resultado se compara con 1.

En este caso, dado que 0or 1nunca es mayor que 1, la declaración completa siempre devolverá false .


Sin embargo, hay una excepción:

Si yes 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;
}
Mysticial avatar Jan 17 '2012 04:01 Mysticial

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 yes un número entero, consideremos las dos posibilidades. 4 > ypuede regresar trueo false. La siguiente parte efectivamente se convierte true > 1en o false > 1.

Dada la conversión implícita de bool a int , hay dos posibilidades: A) 4 > ydevuelve true. trueevalúa a 1. 1 > 1se evalúa como falso. B) 4 > yregresa false. falseevalúa a 0. 0 > 1se 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, aserá evaluado. Si ase evalúa como verdadero, entonces bserá evaluado. En caso contrario, bno será evaluado . En cuanto a a || b, la lógica de cortocircuito funciona a la inversa. aserá evaluado. Dado que la expresión ase evalúa primero, si es falsa, no hay posibilidad de que toda la expresión se evalúe como verdadera.

Dado a || b, aserá evaluado. Si ase evalúa como falso, entonces bserá evaluado. En caso contrario, bno será evaluado . Dado que la expresión ase 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.

Sion Sheevok avatar Jan 17 '2012 04:01 Sion Sheevok

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 > yse evaluará como 0 (falso) o 1 (verdadero), y la expresión completa siempre se evaluará como 0 (falso).

Ted Hopp avatar Jan 17 '2012 04:01 Ted Hopp