Stai confondendo due diversi set di regole che riguardano gli ordini.
La precedenza degli operatori determina quale operatore in un'espressione complessa viene valutato prima dell'altro. La moltiplicazione ha la precedenza sull'aggiunta, che è il motivo per cui 1 + 2 * 3 valuta a 7, non a 9. Le parentesi hanno una precedenza ancora maggiore, in modo che (1 + 2) * 3 valuti a 9.
Sequencing determina quale operazione in un programma si verifica per prima; questo è non la stessa cosa. Ad esempio,
print('a'); print('b');
garantisce che il suo output sia "ab" e non "ba", perché il punto e virgola introduce un punto di sequenza , attraverso il quale le operazioni non possono essere riordinate, non importa quanto il compilatore cerchi di ottimizzare il programma in modo intelligente .
La semantica del pre e post-incremento ++
rientra in questa serie di regole. Di norma, i++
garantisce che la modifica del valore di i
avvenga solo dopo il vecchio valore è stato utilizzato nel calcolo del valore dell'espressione in cui si verifica. Pertanto, l'espressione restituisce sempre un valore basato sul vecchio valore inferiore di i
.
Poiché tutto ciò è piuttosto complicato, ma indispensabile per creare un linguaggio di programmazione affidabile, la saggezza convenzionale non è quella di usare ++
e gli operatori correlati con effetti collaterali all'interno di espressioni complesse. Anche se capisci come interagiscono tutte le regole, il prossimo programmatore di manutenzione potrebbe non farlo e la manutenibilità è la seconda proprietà più importante del software (proprio dietro la correttezza).