Então, eu estava lendo sobre a ordem dos diferentes operadores, e eu li que &&
tem maior importância do que ||
e seria avaliar mais cedo (fonte). Em seguida, alguém fez uma pergunta sobre o que este pedaço de código deve imprimir:
#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;
}
E eu pensei que o c-- <= 0 && d++ > c--
gostaria de, primeiramente, avaliar, o que é verdade no total. após o processo, c
seria igual a -2 e d
seria igual a 1. Em seguida, ele iria começar a verificar a partir do lado esquerdo, a avaliação de a++ > 0 || ++b == 1
o que é verdade, a
seria 1 no final e b
é de 1 em a condição e o depois. assim, o total condição seria true || true
e é verdade, por isso temos de impressão:
if
a:1
b:1
c:-2
d:1
Sim? Aparentemente, não. Eu testei com o GCC (Mingw) no meu sistema (Windows 10), e com uma linha de compilador (este) e impressas:
if
a:1
b:1
c:0
d:0
Eu mudei a condição para isso: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) )
mas o resultado é exatamente o mesmo em ambos os lugares. Há algo que eu não prestar atenção? Ou isto é algo como um bug? Parece quase como que ||
e &&
têm a mesma prioridade, e a coisa toda é avaliada a partir do lado esquerdo, e os curto-circuitos ocorre e outras coisas. Se eu alterar o ++b==1
parte em ++b==0
e , em seguida, a saída é o mesmo que eu previ.
Agradecemos antecipadamente por qualquer tipo de ajuda :)