Por lo que estuve leyendo sobre el orden de los distintos operadores, y he leído que &&
tiene mayor importancia que el ||
y se evalúe la tarde (fuente). Entonces alguien le hace una pregunta acerca de lo que esta pieza de código de impresión:
#include <stdio.h>
int main(){
int a=0, b=0, c=0, d=0;
if(a++>0 || ++b==1 || c--<=0 && d++>c--){
printf("if\na:%d\nb:%d\nc:%d\nd:%d\n",a,b,c,d);
}
else{
printf("else\na:%d\nb:%d\nc:%d\nd:%d\n",a,b,c,d);
}
return 0;
}
Y yo que pensaba que el c-- <= 0 && d++ > c--
evalúe la primera, que es verdadero en total. después de que el proceso, c
será igual a -2 y d
sería igual a 1. Entonces se podría iniciar la comprobación de la izquierda lado, la evaluación de a++ > 0 || ++b == 1
lo cual es cierto, a
sería de 1 en la final y b
es de 1 en la condición y después de eso. por lo que el total de la condición sería true || true
y es verdad, así que vamos a imprimir:
if
a:1
b:1
c:-2
d:1
Sí? Al parecer, no. Lo he probado con GCC (Mingw) en mi sistema (Windows 10), y con un compilador (este) y tanto en la edición impresa:
if
a:1
b:1
c:0
d:0
He cambiado la condición en esto: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) )
pero la salida es exactamente lo mismo en ambos lugares. Hay algo que no me preste atención a? O se trata de algo así como un error? Casi parece como que ||
y &&
tienen la misma prioridad y la cosa entera es evaluada desde el lado izquierdo, y corto-circuitos se produce y otras cosas. Si puedo cambiar el ++b==1
parte en ++b==0
, entonces la salida es el mismo como lo había predicho.
Gracias de antemano por cualquier tipo de ayuda :)