He estado pensando en algunos errores de principiante y terminé con el de la if
declaración. Expandí 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
?
c++
if-statement
TehMattGR
fuente
fuente
i
se establece en1
.1 && i == 0
?Respuestas:
Esto tiene que ver con la precedencia del operador .
no es
porque ambos
&&
y==
tienen una mayor precedencia que=
. Lo que realmente funciona esque asigna el resultado de
1 && (i == 0)
ai
. Entonces, sii
comienza en,0
entoncesi == 0
estrue
, también lo1 && true
estrue
(o1
), y luegoi
se establece en1
. Entonces, dado que1
es verdadero, ingrese el bloque if e imprima el valor que le asignói
.fuente
i = !i; if (i)
escrito correctamenteAsumiendo que su código en realidad se ve así:
Luego esto:
evalúa como
y así
i
se establece en1
.fuente
using namespace std
!=
antes&&
pueda ver el problema. Además, sí, la expansión es extraña, pero no creo que importe tanto. No puedo creer que diferencias tan pequeñas hagan que la gente vote 151 a -4.Tiene que ver con analizar y las reglas de derecha a izquierda. Por ejemplo, y = x + 5.
Todas las sub-expresiones son ponderadas en importancia. Dos expresiones de igual importancia se evalúan de derecha a izquierda,. El lado de expresión && se realiza primero, seguido del LHS.
Tiene sentido para mi.
fuente
La respuesta real es:
Como prueba, solo mira la salida asm de tu compilador para el código que ingresaste (todos los comentarios son míos):
La salida asm anterior era de CLANG, pero todos los otros compiladores que miré dieron una salida similar. Esto es cierto para todos los compiladores en ese sitio, ya sean compiladores C o C ++ puros, todo sin ningún pragma para cambiar el modo del compilador (que por defecto es C ++ para los compiladores C ++)
Tenga en cuenta que su compilador en realidad no estableció i = 1, pero i = TRUE (lo que significa cualquier valor entero no cero de 32 bits). Esto se debe a que el operador && solo evalúa si una declaración es VERDADERA o FALSA, y luego establece los resultados de acuerdo con ese resultado. Como prueba, intente cambiar i = 1 a i = 2 y podrá observar por sí mismo que nada cambiará. Compruébelo usted mismo utilizando cualquier compilador en línea en Compiler Explorer
fuente
i = 1
es un operador de asignación [no de equivalencia]; 2b) Puedo asegurarle queif (i = 0)
se evaluará en condición falsa tanto en C como en C ++, por lo que si se evalúa como verdadero wrt "nunca falla" es algo engañoso.and cl, 1 ; = operator always TRUE
<< corrígeme si estoy equivocado, pero no veo ninguna asignación aquí. Representa la1 &&
parte de la expresión. Entonces, esta respuesta básicamente se evalúa comofalse
.if ( i = 0 ) { print something }
. También su respuesta se contradice a sí misma; al principio dices quei=1
se evalúa antes de que&&
se aplique, y luego al final dices quei
se ajusta al resultado del&&
operador.