Questo è il modo più popolare (mi sembra) di verificare se un valore è in un array:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Tuttavia, in un libro che ho letto molti anni fa da, probabilmente, Wirth o Dijkstra, è stato detto che questo stile è migliore (se confrontato con un ciclo while con un'uscita all'interno ):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
In questo modo la condizione di uscita aggiuntiva diventa una parte esplicita del ciclo invariante, non ci sono condizioni nascoste e uscite all'interno del ciclo, tutto è più ovvio e più in un modo di programmazione strutturata. Generalmente preferivo quest'ultimo schema ogni volta che era possibile e usavo for
-loop per iterare solo da a
a b
.
Eppure non posso dire che la prima versione sia meno chiara. Forse è ancora più chiaro e più facile da capire, almeno per i principianti. Quindi mi sto ancora ponendo la domanda su quale è migliore?
Forse qualcuno può dare una buona motivazione in favore di uno dei metodi?
Aggiornamento: Questa non è una questione di punti di ritorno di funzioni multiple, lambda o ricerca di un elemento in un array di per sé. Riguarda come scrivere loop con invarianti più complessi di una singola disuguaglianza.
Aggiornamento: OK, vedo il punto delle persone che rispondono e commentano: ho mixato nel ciclo foreach qui, che a sua volta è già molto più chiaro e leggibile di un ciclo while. Non avrei dovuto farlo. Ma questa è anche una domanda interessante, quindi lasciatela così com'è: foreach-loop e una condizione extra all'interno, o un ciclo while con un ciclo invariante esplicito e una post-condizione dopo. Sembra che il ciclo di foreach con una condizione e un exit / break sia vincente. Creerò una domanda aggiuntiva senza il ciclo foreach (per un elenco collegato).