5

Eventuali duplicati:
why “++x || ++y && ++z” calculate “++x” firstly ? however,Operator “&&” is higher than “||”Precedenza degli operatori logici in C

Se si guarda alla tabella delle precedenze di C, vedrete che & & ha precedenza maggiore rispetto ||.

Ma date un'occhiata al codice seguente:

a=b=c=1; 

++a || ++b && ++c; 

printf("%d %d %d\n",a,b,c); 

esso stampa "2 1 1", il che significa che il "++ a" viene valutata per prima, e una volta che il programma vede un VERO lì si ferma proprio lì, perché quello che c'è dall'altra parte del || non è importante.

Ma poiché & & ha precedenza maggiore rispetto ||, non dovrebbe "++ b & & ++ c" essere valutata per prima, e poi il risultato inserito di nuovo in "++ un || risultato"? (in questo caso il programma stamperebbe "1 2 2").

+0

Sì, non l'ho capito. Grazie per il testa a testa. –

risposta

13

solo provare ad immaginare con parentesi:

++a || ++b && ++c; 

uguale

(++a) || (++b && ++c); 

che viene valutata da sinistra a destra.

se & & e || avrebbe la stessa precedenza, sembrerebbe

(++a || ++b) && (++c); 
+0

Bella spiegazione, grazie. –

0

&& has higher precedence solo in albero di analisi. Ma compilatore ottimizza il codice come

if(!++a) { 
    ++b && ++c; 
} 
+0

Questa non è un'ottimizzazione. –

+0

Come ti piace di più chiamarlo. Non importa –

+0

L'idea che il cortocircuito sia un "ottimizzazione" è un equivoco che si presenta su SO ancora e ancora. In molti casi, ** non ** il cortocircuito sarebbe l'ottimizzazione. Ad esempio, '++ a | ++ b' (senza rami) è quasi certamente meno costoso da calcolare rispetto a' ++ a || ++ b' (ramo condizionale). Ciò che è importante capire è che il cortocircuito non è un comportamento opzionale, e i risultati sono diversi. –

6

Le regole di precedenza solo dire che sarà valutato in questo modo:

++a || (++b && ++c); 

Ora arriva il comportamento corto circuito degli operatori logici che dice che si deve valutare termini da sinistra a destra e fermarsi quando il risultato è noto. La parte a destra non viene mai eseguita.

+0

Gotcha. Puoi darmi un esempio in cui la precedenza di && su || importa? Grazie –

+0

Importa qui. Se avessero precedenza uguale o se '||' avesse precedenza più alta, sarebbe valutato come '(++ a || ++ b) && ++ c', quindi sia' ++ a' che '++ c' sarebbe valutato –

+0

Buon punto. Grazie. –

0

L'esempio ++a || ++b && ++c corrisponde a ++a || (++b && ++c).

2

Precedenza e ordine di valutazione sono due cose completamente diverse. Per le espressioni logiche dell'operatore, la valutazione è sempre da da sinistra a destra.L'espressione ++a || ++b && ++c viene interpretata come

  1. Valutare ++ un
  2. Se il risultato di 1 è zero, valutare ++ b & & ++ c

l'espressione è analizzato come ++a || (++b && ++c) ; l'intera espressione è vera se una delle sottoespressioni ++a o ++b && ++c è vera.

+0

Gotcha, e sì, la mia confusione era di presumere che la precedenza influiva anche sull'ordine di valutazione. –

Problemi correlati