Post Incremento di una variabile tra parentesi [chiusa]

0

Nel mio esame di computer science c'era una domanda come segue:

i=10, j=51 & k=7.
p = i+(--k +j) + (3*(i++))+i.

Ricevo la risposta come 111. Ecco la mia metodologia:

k è diminuito di uno in (--k + j), e i in (i ++) è aumentato, quindi (3 * (i ++)) + diventa (3 * 11) +11. Ma quando ho inserito le dichiarazioni in BlueJ, la risposta è arrivata come 108. Perché non posso essere incrementato tra parentesi? Secondo il mio libro di testo le parentesi hanno un'importanza maggiore di ++. Il mio libro di testo è sbagliato? O sto sbagliando da qualche parte?

    
posta Alpha Centauri 24.07.2018 - 09:12
fonte

1 risposta

5

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).

    
risposta data 24.07.2018 - 09:42
fonte

Leggi altre domande sui tag