View Single Post
Old 11-01-2005, 12:25   #5
end.is.forever
Senior Member
 
Iscritto dal: Jul 2004
Messaggi: 1578
Scusa mi sono sbagliato a scrivere sostituisci con:
Codice:
for (i=0; i < a.length && a[i] <= v; i++) {
   b[i] = a[i];
   k++;
}
if (i == a.length)
   k++;
Cioe nella condizione nell'and prima i < a.length e poi a[i] <= v.
Probabilmente il motivo per cui ti lancia ancora quell'eccezione è che quella modifica non cambiava nulla, dato che ancora per fare il check della condizione doveva accedere all'elemento i di a.
Questo se i è maggiore della lunghezza scatena un' eccezione.

In teoria il check i < a.length dovrebbe avvenire sempre prima di accedere ad a[i]; un po come se facessi
Codice:
if (i < a.length)
   if (a[i] <= v)
in questo modo non ci può essere mai una eccezione.

Per fortuna questa cosa la puoi fare anche usando semplicemente l'operatore and, dato che Java come quasi tutti i linguaggi imperativi "ottimizza" l'operatore and; infatti and restituisce true solo se entrambi gli operandi sono true; questo vuol dire che se già il primo restituisce false, allora qualunque sia il valore del secondo il risultato sara comunque false.
Per questo motivo se il primo degli operandi è false il secondo non viene neanche controllato.

Tu puoi sfruttare questa cosa considerando che quando viene controllato il secondo operando dell'and, hai la garanzia che il primo è già risultato true (in questo caso hai la garanzia che i rispetta la lunghezza dell'array).

La stessa cosa vale per l'or, per cui se il primo è true, il secondo non viene controllato.
end.is.forever è offline   Rispondi citando il messaggio o parte di esso