Donc, je lisais à propos de l'ordre des différents opérateurs, et j'ai lu que &&
est plus important que les ||
et il permettrait d'évaluer plus tôt (source). Ensuite, quelqu'un a posé une question au sujet de ce que ce morceau de code d'impression:
#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;
}
Et j'ai pensé que l' c-- <= 0 && d++ > c--
d'évaluer d'abord, ce qui est vrai dans l'ensemble. après le processus, c
serait égale à -2 et d
serait égal à 1. Ensuite, il serait de commencer à vérifier à partir de la gauche, de l'évaluation a++ > 0 || ++b == 1
ce qui est vrai, a
1 à la fin de la b
est 1 dans la condition et après. de sorte que le total de l'état de true || true
et il est vrai, de sorte que nous allons imprimer:
if
a:1
b:1
c:-2
d:1
Oui? Apparemment, non. Je l'ai testé avec GCC (Mingw) sur mon système (Windows 10), et avec un compilateur en ligne (cette une) et les deux imprimés:
if
a:1
b:1
c:0
d:0
J'ai changé la condition suivante: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) )
mais le résultat est exactement la même chose sur les deux lieux. Il y a une chose que je ne fais pas attention? Ou est-ce quelque chose comme un bug? Il ressemble presque que ||
et &&
ont la même priorité et la chose entière est évaluée à partir de la gauche, et que le court-circuit se produit et d'autres choses. Si je change le ++b==1
la partie en ++b==0
, alors la sortie est la même que j'avais prédit.
Merci d'avance pour toute aide :)