La risposta è no - l'if-statement non è come una dichiarazione di commutazione senza interruzione. Cominciamo da questa parte della tua domanda:
if boolean_expression_1 was true, would it check if boolean_expression_2 is true?
Possiamo trovare la risposta con questo programma. Il trucco è che noi chiamiamo un metodo come nostra espressione_bolea e usiamo System.out.println () per vedere se il metodo viene eseguito. In questo modo sappiamo se l'espressione è stata valutata. Ecco il programma:
public class IfElseExample {
private static boolean booleanExpression1() {
System.out.println("Expression 1 is being evaluated.");
return true;
}
private static boolean booleanExpression2() {
System.out.println("Expression 2 is being evaluated.");
return true;
}
public static void main(String[] args) {
if (booleanExpression1())
System.out.println("Statement 1 is executed");
else if (booleanExpression2())
System.out.println("Statement 2 is executed");
else
System.out.println("Default statement is executed");
}
}
Vedrai che la seconda espressione booleana non viene valutata. Questo comportamento diventa probabilmente più comprensibile se si inseriscono alcune parentesi (che è una buona abitudine nella maggior parte dei casi):
if (booleanExpression1()) {
System.out.println("Statement 1 is executed");
} else {
if (booleanExpression2()) {
System.out.println("Statement 2 is executed");
} else {
System.out.println("Default statement is executed");
}
}
Questo è il modo in cui il compilatore visualizza la tua catena if originale. Come puoi vedere ora, il secondo "se" è una sua singola affermazione e come tale non si trova allo stesso livello della prima dichiarazione if. Se si concatenano più istruzioni if quelle che vengono nidificate ancora più in profondità.
Hai anche chiesto, perché l'istruzione switch necessita di un'istruzione break. Questo perché l'istruzione switch non è implementata internamente con una catena di if-statement (né l'if-statement basato su istruzioni switch). Potresti aspettarti che
switch(controllingExpression()) {
case 42: System.out.println("A");
case 43: System.out.println("B");
default : System.out.println("z");
}
viene tradotto dal compilatore in qualcosa di simile:
if (controllingExpression() == 42) {
System.out.println("A");
} else if (controllingExpression() == 43) {
System.out.println("B");
} else {
System.out.println("z");
}
Questo non è il caso. Invece utilizza un'istruzione skip nascosta:
int x = numberOfStatementsToSkipFor(controllingExpression());
skip x // hidden skip the next x statements byte code instruction
System.out.println("A");
System.out.println("B");
System.out.println("z");
Il metodo numberOfStatesmentsToSkipFor () restituisce 0 per 42, 1 per 43 e 2 per tutto il resto. Ora diventa chiaro il motivo per cui questo programma potrebbe produrre
A
B
z
o
B
z
o solo
z
ma mai
A
B
senza la 'z'. Ma chiaramente sarebbe bello se potessimo farlo. E possiamo usare break che viene tradotto in un'altra istruzione skip. Quindi se metti un'interruzione in tutti i rami del caso
switch(controllingExpression()) {
case 42: {
System.out.println("A");
break;
}
case 43: {
System.out.println("B");
break;
}
default : System.out.println("z");
}
il compilatore produrrà questo:
int x = numberOfStatementsToSkip(controllingExpression());
skip x; // hidden skip the next x statements byte code instruction
System.out.println("A");
skip 3; //"B" + skip + "z"
System.out.println("B");
skip 1;
System.out.println("z");