2012-03-13 11 views
5

Si tengo el siguiente sentencia ifEvaluación de && operador booleano

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

Dónde row es un valor int y array es un objeto int[][].

Mi pregunta es, si esto arrojará una excepción si row = -1, ya que la matriz no tendrá un campo -1, por lo que la excepción fuera de límites? ¿O se detendrá en la primera parte de if, the (row! = - 1) y como eso es falso, ignorará el resto? ¿O para asegurarse de que no arroje una excepción, debería separar la declaración if anterior en dos?

(por favor, no me diga a comprobarlo por mí mismo :) estoy pidiendo aquí porque quiero hacer una pregunta de seguimiento, así ...)

+1

se detendrá en la primera condición si se evalúa como falsa – Asaf

+1

Java es uno de los lenguajes de programación que tiene un cortocircuito para los operadores lógicos, por lo que funciona como era de esperar. VB y SQL son idiomas que no tienen esta característica, lo que significa que tendría que usar un medio diferente para evitar una excepción fuera de límites. – Gabe

+1

Se detendrá en la primera prueba y no probará la segunda prueba. – Java42

Respuesta

3

Se detendrá de forma segura antes de lanzar una excepción

El && es una short-circuiting boolean operator, lo que significa que va a detener la ejecución de la expresión, tan pronto como una parte devuelve falso (ya que esto significa que toda la expresión debe ser falsa)

Tenga en cuenta que también garantiza la evaluación de las partes de la expresión en orden, por lo que es seguro de usar en situaciones como estas.

+0

Y supongo que si tengo varias declaraciones como la anterior, separadas con un operador OR ||, todavía no arrojará una excepción ... ya que cada && tendrá un short-cirtuit individual. lo que quiero decir es if ((&&) || (&&)) – AndreiBogdan

+1

Correcto ... siempre y cuando cada declaración secundaria se cortocircuite con éxito, entonces estarás bien. – mikera

2

No arrojará una excepción. Sin embargo, si row es < -1 (-2 por ejemplo), entonces se encontrará con problemas.

1

No, No lo hará. el compilador no se compruebe la segunda expresión si la primera expresión es falsa ... Por eso & & se llama operador de "cortocircuito" ...

1

La mayoría de los lenguajes de programación cortocircuitan la prueba cuando la primera expresión devuelve false para una prueba AND y true para una prueba OR. En su caso, la prueba Y se cortocircuitará y no se producirá excepción.

1

Muchos lenguajes de programación tienen short-circuit evaluation para operadores lógicos.

En una declaración como A and B, el idioma evaluará primero A. Si A es falso, entonces toda la expresión es falsa; no importa si B es verdadero o falso.

En su caso, cuando row es igual a -1, row != -1 será falso y el cortocircuito de la expresión de la matriz no se evaluará.

Además, su segunda pregunta sobre el comportamiento del índice de matriz depende totalmente del idioma. En C, array[n] significa *(array + n). En python, array[-1] le proporciona el último elemento de la matriz. En C++, es posible que tenga una matriz con un operador [] sobrecargado que también acepta índices negativos. En Java, obtendrá un ArrayIndexOutOfBoundsException.

1

Además, es posible que necesite algo como lo siguiente (o simplemente use 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; 
} 
Cuestiones relacionadas