¿Por qué esta declaración if que combina la asignación y una verificación de igualdad devuelve verdadero?

Resuelto Matt Zafeiriou asked hace 5 años • 4 respuestas

He estado pensando en algunos errores de principiante y terminé con el del ifenunciado. Amplié un poco el código a esto:

int i = 0;
if (i = 1 && i == 0) {
    std::cout << i;
}

He visto que la ifdeclaración devuelve verdadero y coutes icomo 1. Si ise asigna 1en la declaración if, ¿por qué i == 0regresó true?

Matt Zafeiriou avatar May 23 '19 03:05 Matt Zafeiriou
Aceptado

Esto tiene que ver con la precedencia de los operadores .

if (i = 1 && i == 0)

no es

if ((i = 1) && (i == 0))

porque ambos &&y ==tienen una precedencia mayor que =. Lo que realmente funciona es

if (i = (1 && (i == 0)))

que asigna el resultado de 1 && (i == 0)a i. Entonces, si icomienza en 0entonces i == 0es true, también lo 1 && truees true(o 1) y luego ise establece en 1. Entonces, como 1es cierto, ingresa el bloque if e imprime el valor que le asignó i.

NathanOliver avatar May 22 '2019 20:05 NathanOliver

Suponiendo que su código realmente se vea así:

#include <iostream>
using namespace std;

int main()  {
    int i = 0;
    if (i = 1 && i == 0) {
        cout << i;
    }
}

Luego esto:

if (i = 1 && i == 0) {

evalúa como

 if (i = (1 && i == 0)) {

y por eso ise establece en 1.

 avatar May 22 '2019 20:05