2016.08.04
switch文
はじめに
switch文は、式の値によって処理を分岐するものです。
caseで指定する定数の値と一致した場合にcase~とbreakに囲まれた処理を実行します。caseで指定した定数と一致しなかった場合はdefault~とbreakに囲まれた処理を実行します。
書き方
その一般的な書き方は、以下のとおりです。
switch ( 式 ) { case 定数1: 処理文1 break; case 定数2: 処理文2 break; : case 定数n: 処理文n break; default: 処理文 break; }
式が定数1~nのいずれかと一致したときに、その定数に応じた処理文を実行します。case 定数: ~ break;の間の処理文が実行されます。default:は、どの定数とも一致しなかったときの分岐処理です。これは省略することができます。
上記のswitch-case文をif文で書くと以下のようになります。else文を使うのネストが深くなります。変数と定数を演算子'=='で比較し、同じであれば処理を実行し、違えば変数と別の定数との比較を行なっていきます。
if ( 変数==定数1 ) { 処理文1 } else { if ( 変数==定数2 ) { 処理文2 } else { if ( 変数==定数3 ) { 処理文3 } else { : } }
else文を使わない場合はネストは深くなりませんが、処理の中で変数の値を変更した場合に正しい結果が得られないことがあります。
下の例で、変数と定数2が等しい場合、処理文2が実行され、変数に定数3を代入します。その結果、次のif文で変数と定数3の比較を行なっているので処理文3も実行されてしまいます。これが狙い通りであれば問題ないですが、違うのであればelseを使う必要があります。
if ( 変数==定数1 ) {
処理文1
}
if ( 変数==定数2 ) {
class="sourcecoment">// 処理文2
変数==定数3
}
if ( 変数==定数3 ) {
処理文3
}
:
if ( 変数==定数n ) {
処理文n
}
それでは次に、違う定数で同じ処理を実行するときのswitch文の書き方を説明します。以下がその例です。
switch (式 ) { case 定数1: case 定数2: 処理文1 break; case 定数2: case 定数3: case 定数4: 処理文2 break; : case 定数n: 処理文n break; default: 処理文 break; }
case 定数を並べることで複数の定数に対して、同じ処理を実行できるようになります。上の例の場合、式が定数1または定数2の場合に処理文1を実行、式が定数3または定数4または定数5の場合に処理文2を実行します。、
Javaソースコード その1
Switch1.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022
public class Switch1 { public static void main( String[] args ) { int a; a = 2; switch ( a ) { case 1: System.out.println( "aの値は1です。" ); break; case 2: System.out.println( "aの値は2です。" ); break; case 3: System.out.println( "aの値は3です。" ); break; default: System.out.println( "aの値は1、2、3ではありません。" ); break; } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Switch1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Switch1.java
実行
C:\talavax\javasample>java Switch1
出力結果
aの値は2です。
005
a = 2;
007 008 009 010 011 012 013 014 015 016 017 018 019 020
switch ( a ) { case 1: System.out.println( "aの値は1です。" ); break; case 2: System.out.println( "aの値は2です。" ); break; case 3: System.out.println( "aの値は3です。" ); break; default: System.out.println( "aの値は1、2、3ではありません。" ); break; }
a=2なのでcase 2:のSystem.out.println( "aの値は2です。" );が実行されます。
Javaソースコード その2
次のサンプルは、case文を並べた例です。
Switch2.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023
public class Switch2 { public static void main( String[] args ) { int a; a = 4; switch ( a ) { case 1: case 2: System.out.println( "aの値は1または2です。" ); break; case 3: case 4: case 6: System.out.println( "aの値は3または4または6です。" ); break; default: System.out.println( "aの値は1、2、3、4、6以外です。" ); break; } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Switch2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Switch2.java
実行
C:\talavax\javasample>java Switch2
出力結果
aの値は3または4または6です。
005
a = 4;
007 008 009 010 011 012 013 014 015 016 017 018 019 020 021
switch ( a ) { case 1: case 2: System.out.println( "aの値は1または2です。" ); break; case 3: case 4: case 6: System.out.println( "aの値は3または4または6です。" ); break; default: System.out.println( "aの値は1、2、3、4、6以外です。" ); break; }
a=4なのでcase 4:のときに実行される処理、System.out.println( "aの値は3または4または6です。" );が実行されます。
Javaソースコード その3
次のサンプルは、caseのbreak文を省略したした例です。break文を省略すると条件に合ったcase文から処理が実行されます。処理を進めていきbreak文が見つかるか、switch文の最後まで処理が実行されれば処理を終了します。このサンプルは、これを利用して1~nの合計値を計算するものです。
Switch3.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045
public class Switch3 { public static void main( String[] args ) { int n, total; // 1~nの合計を計算 n = 10; // totalの処理値を0 total = 0; switch ( n ) { case 15: total += 15; case 14: total += 14; case 13: total += 13; case 12: total += 12; case 11: total += 11; case 10: total += 10; case 9: total += 9; case 8: total += 8; case 7: total += 7; case 6: total += 6; case 5: total += 5; case 4: total += 4; case 3: total += 3; case 2: total += 2; case 1: total += 1; } // 結果を出力 System.out.println( "1~" + n + "の合計 : " + total ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Switch3.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Switch3.java
実行
C:\talavax\javasample>java Switch3
出力結果
1~10の合計 : 55
005 006
// 1~nの合計を計算
n = 10;
008 009
// totalの処理値を0
total = 0;
010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041
switch ( n ) { case 15: total += 15; case 14: total += 14; case 13: total += 13; case 12: total += 12; case 11: total += 11; case 10: total += 10; case 9: total += 9; case 8: total += 8; case 7: total += 7; case 6: total += 6; case 5: total += 5; case 4: total += 4; case 3: total += 3; case 2: total += 2; case 1: total += 1; }
合計値を計算するswitch文です。case文の定数は15から1なのでn=1~15の範囲で合計値を計算することができます。case文の定数に対応した箇所から処理が開始されswitch文の最後まで処理を実行します。n=10の場合,21行目の"case 10:"から下の処理を実行します。
042 043
// 結果を出力 System.out.println( "1~" + n + "の合計 : " + total );
合計値をprintlnメソッドでコンソール出力しています。
実際にプログラムをこのような合計値をprintlnメソッドでコンソール出力しています。
以上です。