¿Por qué esta declaración if que combina la asignación y una verificación de igualdad devuelve verdadero?
He estado pensando en algunos errores de principiante y terminé con el del if
enunciado. Amplié un poco el código a esto:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
He visto que la if
declaración devuelve verdadero y cout
es i
como 1
. Si i
se asigna 1
en la declaración if, ¿por qué i == 0
regresó true
?
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 i
comienza en 0
entonces i == 0
es true
, también lo 1 && true
es true
(o 1
) y luego i
se establece en 1
. Entonces, como 1
es cierto, ingresa el bloque if e imprime el valor que le asignó i
.
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 i
se establece en 1
.