答えはノーです-ifステートメントは、休憩なしのスイッチステートメントのようなものではありません。あなたの質問のこの部分から始めましょう:
boolean_expression_1がtrueの場合、boolean_expression_2がtrueかどうかを確認しますか?
このプログラムで答えを見つけることができます。コツは、メソッドをboolean_expressionとして呼び出し、System.out.println()を使用して、メソッドが実行されるかどうかを確認することです。このようにして、式が評価されたかどうかを確認します。ここにプログラムがあります:
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");
}
}
2番目のブール式が評価されないことがわかります。この振る舞いは、いくつかの括弧を入れるとおそらく理解しやすくなります(ほとんどの場合、これは良い習慣です)。
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");
}
}
これは、コンパイラーが元のifチェーンを表示する方法です。ご覧のとおり、2番目の「if」はそれ自体の単一のステートメントであり、最初のifステートメントと同じレベルにはありません。より多くのifステートメントをチェーンすると、それらはさらに深くネストされます。
また、switchステートメントにbreakステートメントが必要な理由も尋ねました。これは、switchステートメントが内部でifステートメントのチェーンを使用して実装されていないためです(どちらもswitchステートメントに基づくifステートメントではありません)。あなたはそれを期待するかもしれません
switch(controllingExpression()) {
case 42: System.out.println("A");
case 43: System.out.println("B");
default : System.out.println("z");
}
コンパイラによって次のようなものに変換されます:
if (controllingExpression() == 42) {
System.out.println("A");
} else if (controllingExpression() == 43) {
System.out.println("B");
} else {
System.out.println("z");
}
これはそうではありません。代わりに、非表示のスキップステートメントを使用します。
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");
メソッドnumberOfStatementsToSkipFor()は、42の場合は0、43の場合は1、その他すべての場合は2を返します。これで、このプログラムが生成する可能性がある理由が明らかになります
A
B
z
または
B
z
あるいは単に
z
しかし決して
A
B
「z」なし。でもこれができたらいいのは明らかです。そして、breakを使用して、別のskipステートメントに変換できます。したがって、すべてのケースブランチにブレークを入れると
switch(controllingExpression()) {
case 42: {
System.out.println("A");
break;
}
case 43: {
System.out.println("B");
break;
}
default : System.out.println("z");
}
コンパイラはこれを生成します:
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");