Dato il seguente pezzo valida di codice:istruzioni Java, l'elaborazione di precedenza ("penzoloni altro")
Boolean a = false;
if (a)
System.out.println("A");
else
System.out.println("!A");
Ora, in base alla documentazione if
tra cui sua condizione ed interna statement
è anche un statement
(https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html - a almeno si chiama if-statement
tutta la documentazione)
ad esempio:
if (b){
System.out.println("B");
}
è un statement
.
Tuttavia, quando sostituiremo una dichiarazione esistente con un'altra, non dovrebbe toccare la logica generale, giusto? Supponendo che si sostituisce la (Expression) - statement
con l'if-statement
sopra:
Boolean a = false;
Boolean b = false:
if (a)
if (b){
System.out.println("A and B");
}
else
System.out.println("!A");
Java Compiler interpreterà l'esempio di codice nel modo seguente (tra parentesi graffe completo per visualizzare la spiegazione):
Boolean a = false;
Boolean b = false:
if (a){
if (b){
System.out.println("A nad B");
} else {
System.out.println("!A");
}
}
che non è la logica iniziale .
Quindi perché si scambia una dichiarazione con un'altra che modifica la logica?
Dall'esempio si può chiaramente dire che il problema è solo il parentesi, ma non riesco a trovare le informazioni sul modo in cui Java è esattamente a che fare con questo, se parentesi graffe sono ommited.
Quindi sono interessato solo se c'è qualcosa di scritto su questo comportamento? Perché java preferisce collegare lo else
al più recente if
, anziché il primo if
che incontra durante l'analisi?
Se il collegamento è l'altro per la prima 'if', che cosa accadrà se c'è un'altra cosa di sotto di essa? – Codebender
L'istruzione che hai citato da ORACLE probabilmente si applica solo quando vengono utilizzate le parentesi. – Elbek
Questa è un'area comune di ambiguità. [Wikipedia Dangling altro articolo.] (Https://en.wikipedia.org/wiki/Dangling_else) Hai detto "quale non è la logica iniziale". nella tua domanda, ma la cosa è che secondo il compilatore Java era * la logica iniziale. Se Java fosse come Python in quanto riguardava l'indentazione, sarebbe stato in grado di distinguere come ci si aspettava perché il 'else' era sullo stesso livello del primo' if', ma far rientrare il rientro è effettivamente lo stesso di far rispettare il uso di parentesi graffe. –