Come ha detto @Karl Bielefeldt nella sua risposta, questo di solito è un non-problema.
Tuttavia, era una volta un problema comune in C e C ++, e un trucco è arrivato a risolvere il problema senza ridurre la leggibilità del codice- iterare all'indietro, fino a 0
.
final x = 10;//whatever constant value
for(int i = Math.floor(Math.sqrt(x)); i >= 0; i--) {
//...do something
}
Ora il condizionale in ogni iterazione è solo >= 0
che ogni compilatore compilerà in 1 o 2 istruzioni di assemblaggio. Ogni CPU prodotta negli ultimi decenni dovrebbe avere controlli di base come questi; facendo un rapido controllo sulla mia macchina x64 vedo che questo si trasforma in cmpl $0x0, -0x14(%rbp)
(valore long-int-compare 0 vs register rbp offset -14) e jl 0x100000f59
(salta all'istruzione che segue il ciclo se il confronto precedente era true per "2nd-arg < 1st-arg") .
Notare che ho rimosso + 1
da Math.floor(Math.sqrt(x)) + 1
; affinché il calcolo matematico funzioni, il valore iniziale dovrebbe essere int i = «iterationCount» - 1
. Vale anche la pena notare che il tuo iteratore deve essere firmato; unsigned int
non funzionerà e probabilmente compiler-warn.
Dopo aver programmato in linguaggi basati su C per ~ 20 anni, ora scrivo solo loop iterating al contrario, a meno che non vi sia un motivo specifico per forward-index-iterate. Oltre ai controlli più semplici nei condizionali, l'iterazione inversa spesso comporta anche passaggi laterali che altrimenti sarebbero fastidiose matrici di array, mentre iterating.