Tak som čítal o poradí jednotlivých subjektov, a ja som čítal, že &&
má vyšší význam, ako ||
a to by hodnotila skôr (zdroj). Potom niekto otázku o tom, čo tento kus kódu bude tlače:
#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;
}
A ja som si myslel, že c-- <= 0 && d++ > c--
by vyhodnotiť ako prvý, čo je pravda, v celkom. po procese, c
by byť rovná -2 a d
by byť rovná 1. Potom by to spustiť kontrolu z ľavej strany, hodnotenie a++ > 0 || ++b == 1
čo je pravda, a
by byť 1 na konci a b
1 v stave a po. takže celkový stav by byť true || true
a je to pravda, tak budeme tlače:
if
a:1
b:1
c:-2
d:1
Áno? Zdá sa, že nie. Som vyskúšal s GCC (Mingw) na môj systém (Windows, 10), a s online prekladač (tento jeden) a oba vytlačené:
if
a:1
b:1
c:0
d:0
Som zmenil podmienku na to: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) )
ale výstup je presne tú istú vec, na oboch miestach. Je tam niečo, čo nechcem venovať pozornosť? Alebo je to niečo ako chyba? Takmer to vyzerá, že ||
a &&
majú rovnakú prioritu a celá vec je hodnotené z ľavej strany, a skratu, vyskytuje a iné veci. Ak by som zmeniť ++b==1
časť do ++b==0
potom výstup je rovnaký, ako som predpovedal.
Vďaka vopred za akúkoľvek druh pomoci :)