Tak jsem četl o zájmu různých subjektů, a četl jsem, že &&
má vyšší význam než ||
a to by vyhodnotit dříve (zdroj). Pak se někdo zeptal na otázku o tom, co tento kus kódu by tisk:
#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 já si myslel, že c-- <= 0 && d++ > c--
by vyhodnotit jako první, což je pravda v celkem. po procesu, c
bude se to rovnat -2 a d
bude se to rovnat 1. Pak to začne kontrolu z levé strany, hodnocení a++ > 0 || ++b == 1
což je pravda, a
by 1 na konci a b
1 ve stavu a po. takže celkový stav by měl být true || true
a je to pravda, tak se vypíše:
if
a:1
b:1
c:-2
d:1
Ano? Zdá se, že ne. Testoval jsem to s GCC (Mingw) na můj systém (Windows 10), a s on-line compiler (tenhle) a tištěné:
if
a:1
b:1
c:0
d:0
Jsem se změnil stav na toto: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) )
ale výstup je stejné na obou místech. Je tam něco, co já ne věnovat pozornost? Nebo je to něco jako chyba? Skoro to vypadá, že ||
a &&
mají stejnou prioritu a celá věc je hodnocen z levé strany, a krátký-obvodů se vyskytuje a další věci. Pokud změním ++b==1
součástí do ++b==0
, pak na výstupu je stejné jak jsem předpovídal.
Díky předem za jakoukoliv pomoc :)