Così stavo leggendo l'ordine di diversi operatori, e ho letto che &&
ha maggiore importanza rispetto a ||
e sarebbe valutare prima (fonte). Poi qualcuno mi ha chiesto una domanda su questo pezzo di codice stampa:
#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 ho pensato che la c-- <= 0 && d++ > c--
di valutare in primo luogo, che è vero in totale. dopo il processo, c
sarebbe pari a -2 e d
dovrebbe essere uguale a 1. Quindi si potrebbe iniziare a controllare il lato sinistro, la valutazione a++ > 0 || ++b == 1
il che è vero, a
sarebbe 1 alla fine e b
è 1 in condizione e dopo. pertanto il totale condizione non sarebbe true || true
ed è vero, così ci sarà di stampa:
if
a:1
b:1
c:-2
d:1
Sì? A quanto pare, no. Ho provato con GCC (Mingw) sul mio sistema (Windows 10), e con un compilatore online (questo) e su carta stampata:
if
a:1
b:1
c:0
d:0
Ho cambiato la condizione in questo: if(a++>0 || ++b==1 || (c--<=0 && d++>c--) )
ma l'uscita è esattamente la stessa cosa in entrambi i luoghi. C'è qualcosa che io non prestare attenzione? O si tratta di qualcosa come un bug? Sembra quasi che ||
e &&
hanno la stessa priorità, e il tutto viene valutato dal lato sinistro, e i corto circuiti verifica e di altre cose. Se cambio il ++b==1
parte in ++b==0
allora l'uscita è la stessa come avevo previsto.
Grazie in anticipo per qualsiasi tipo di aiuto :)