2012-03-13 22 views
5

Se ho il seguente ifValutazione del && operatore booleano

if ((row != -1) && (array[row][col] != 10)) { 
    .... 
} 

Dove row è un valore int e array è un oggetto int[][].

La mia domanda è, se questo genererà un'eccezione se row = -1 come l'array non avrà un campo -1, quindi l'eccezione fuori limite? O si fermerà alla prima parte di if, the (row! = - 1) e poiché ciò è falso, ignorerà il resto? Oppure, per essere sicuro che non generi un'eccezione, dovrei separare la dichiarazione di cui sopra in due?

(Pls, non ditemi controllare questo fuori per la mia auto :) Io sto chiedendo qui perche' voglio fare una domanda follow così ...)

+1

si fermerà sulla prima condizione, se vale false – Asaf

+1

Java è uno dei linguaggi di programmazione che ha cortocircuitando per gli operatori logici, in modo che funziona come ci si aspetterebbe. VB e SQL sono lingue che non hanno questa caratteristica, il che significa che si dovrebbe usare un metodo diverso per evitare un'eccezione fuori dai limiti. – Gabe

+1

Si fermerà al primo test e non tenterà il secondo test. – Java42

risposta

3

Si arresterà in modo sicuro prima un'eccezione

Il && è un short-circuiting boolean operator, il che significa che si fermerà l'esecuzione dell'espressione non appena una parte restituisce falso (perché questo significa che l'intera espressione deve essere falsa).

Nota che è anche garantito di valutare le parti dell'espressione in ordine, quindi è sicuro da usare in situazioni come queste.

+0

E suppongo che se avrò più istruzioni come sopra, separate con un operatore OR ||, non genererà comunque un'eccezione ... dato che ogni && sarà individualmente corta-cirtuit? quello che voglio dire è if ((&&) || (&&)) – AndreiBogdan

+1

Corretto .... finché tutti i cortocircuiti delle sotto-istruzioni con successo allora starai bene. – mikera

2

Non genera un'eccezione. Tuttavia, se la riga è < -1 (-2 per esempio), si verificheranno dei problemi.

1

No, Non ci sono. il compilatore non controlla la seconda espressione se la prima espressione è falsa ... Ecco perché & & operatore è chiamato "corto circuito" ...

1

La maggior parte dei linguaggi di programmazione esegue il cortocircuito del test quando la prima espressione restituisce false per un test AND e true per un test OR. Nel tuo caso, il test AND sarà cortocircuitato e non si verificherà alcuna eccezione.

1

Molti linguaggi di programmazione hanno short-circuit evaluation per operatori logici.

In una dichiarazione come A and B, la lingua valuterà prima A. Se A è falso, l'intera espressione è falsa; non importa se B è vero o falso.

Nel tuo caso, quando row è uguale a -1, row != -1 sarà falso, e il cortocircuito dell'espressione dell'array non verrà valutato.

Inoltre, la seconda domanda sul comportamento dell'indice dell'array dipende interamente dalla lingua. In C, array[n] significa *(array + n). In python, array[-1] fornisce l'ultimo elemento dell'array. In C++, potresti avere un array con un operatore sovraccarico [] che accetta anche indici negativi. In Java, avrai un ArrayIndexOutOfBoundsException.

1

Inoltre, potresti aver bisogno di qualcosa come il seguente (o semplicemente usare un try/catch).

boolean isItSafe(int[][] a, int x, int y) { 
    boolean isSafe = true; 
    if (a == null || a.length == 0 || x >= a.length || x < 0 || y < 0 || y >= a[0].length) { 
     isSafe = false; 
    } 
    return isSafe; 
} 
Problemi correlati