リスキルテクノロジー

switch文の危険な使い方

以前に
『分岐処理とは?』のところで登場した
「switch文」を覚えているでしょうか。

「switch文」は
多分岐処理を記述する際に、

if文よりも
ソースコードの読みやすさと実行速度に
優れている、

というお話をしました。

しかし、
この「switch文」には
危険な使い方があるのです。

「switch文」の書式

「switch文」の一般的な書式は、
以下のようになります:

switch (条件式) {
case i:
条件式がiのときの処理
 break;
case j:
条件式がjのときの処理
 break;
...
default:
 条件式が上記以外のときの処理
 break;
}

※i, jは異なる整数

具体的には、

int value = x; ...①

switch (value) {
case 0:
System.out.println("0");
break;
case 1:
System.out.println("2");
break;
default:
System.out.println("-1");
break;
}

上記の場合、

①のxが0なら
0
と出力され、

①のxが1なら
1
と出力され、

①のxが0と1以外なら
-1
と出力されます。

「switch文」では、
このような書き方が一般的なのですが、
『フォールスルー』という特殊な書き方も
存在します。

フォールスルー
(fall through)

『フォールスルー』とは、
switch文において、breakを省略した
書き方のことです。

breakを省略とは
どういうことでしょうか。

例えば、

int value = x; ...②

switch (value) {
case 0:
case 1:
System.out.println("0or1");
break;
default:
System.out.println("-1");
break;
}

上記の場合、

②のxが0か1なら
0or1
と出力され、

②のxが0と1以外なら
-1
と出力されます。

このようにswitch文では、
case文にbreakを記述することは
強制ではないのです。

breakは、次のcase文の処理を
実行させたくない場合に記述します。

そのため、
もし次のcase文の処理を
続けて実行したいときには、
breakを省略できるのです。

危険なフォールスルー

さて、先ほどのフォールスルーの例は、
あまり危険ではありません。
(逆に直感的で読みやすい)

しかし、以下のような例では
どうでしょうか。

int value = x; ...③

switch (value) {
case 0:
System.out.println("0");
case 1:
System.out.println("1");
break;
default:
System.out.println("-1");
break;
}

上記の場合、

③のxが0なら
0
1
と出力され、

③のxが1なら
1
と出力され、

③のxが0と1以外なら
-1
と出力されます。

このようなフォールスルーは、
処理が複雑になりやすく、

さらに、
ソースコードを見たときに、
意図的にbreakを記述しなかったのか、
単にbreakを記述し忘れたのか、
区別がつきにくくなります。

基本的には意図的ではない
(記述し忘れによる)
『フォールスルー』は
バグとなってしまいます。

kohsaka

このような
危険なフォールスルー対策として、
「C#」というプログラミング言語では、
フォールスルーを記述できないように
なっています。

そのため、switch文を使う際には、
極力フォールスルーは使わないように
心掛けてください。

■PS

こちらでの記事を更新しはじめました。下記の記事は人気です。
フリーテキストエディタ11選

11日間でLPIC102に合格するための対策法

LPIC102

LPIC102の受験をお考えだろうか?

LPIC102はLPICレベル1を取得するために必要な試験だ。また、資格という意味以外でもプロフェッショナルなLinuxエンジニアになるには非常に役立つ知識が詰まった試験で有益である。

しかし、いざ勉強をはじめるとなると何から対策するべきなのか悩むのではないだろうか?

そんな方のために、このページでは11日でLPIC102に受かるための対策方法や勉強方法をお伝えする。受験費用や受験の流れもお話しするので、きっと役に立つはずだ。

続きを読む

10日間でLPIC101に合格するための対策法

もしあなたがLPIC101を受験しようと思っているならこのページは役に立つはずだ。

なぜなら、このページはLPIC101に10日間で受かるための対策方法をまとめているからだ。

LPIC101はLPICの最初の試験に当たるが、想像以上に範囲も広く、内容も濃い。

対策方法や勉強方法だけではなく、そもそもの試験範囲、受験料、当日の対策などもまとめているので、参考にしてぜひLPIC101を取得してほしい。

続きを読む

徹底解説!取得したい資格8年連続第一位のLPICとは?

LPICとは、Linux技術を証明するための資格試験だ。

技術者のスキルを証明するための資格は数多くあるが、LPICほどIT業界で標準的になっている資格は少ない。

世界中で資格を展開し、Linuxの技術者認定試験としては世界最大だ。プロのエンジニアを目指す方にとっては、もってこいの資格だろう。

そこで、このページでは、LPICの詳細について詳しくご紹介する。 どのような試験で、どういった内容で、どのように勉強すればいいかこのページを見ればわかる。

ぜひ、資格の取得やキャリアアップの役に立ててほしい。

続きを読む

Javaプログラミング ~陥りやすいミス①~

今回から数回に渡り、
「Javaプログラミングにおける
 初心者が陥りやすいミス」
についてお話しようと思います。

第一弾は、

「インクリメント演算子と
 ディクリメント演算子」

に関する注意点です。

インクリメント演算子
ディクリメント演算子

この演算子は、
単項演算子にというものに
分類されます。

インクリメント演算子は「++」と記述し、
オペランドに1を加算する演算子です。

ディクリメント演算子は「--」と記述し、
オペランドから1を減算する演算子です。

さらに、この演算子を
オペランドの前に記述した場合、

例えば、

 ++i
 --i

のような場合(iは変数)、

「前置インクリメント演算子」
「前置ディクリメント演算子」

と呼びます。

また、この演算子を
オペランドの後ろに記述した場合、

例えば、

 i++
 i--

のような場合(iは変数)、

「後置インクリメント演算子」
「後置ディクリメント演算子」

と呼びます。

なぜ、同じ演算子で
記述の仕方が2種類あるのでしょうか。

前置と後置の違い

前置と後置の具体的な例を
見ていきましょう。

ここでは、
インクリメント演算子の例を
見ていきます。

例(その1)

 
int i = 0;
int j = 0;

i++;
++j;
System.out.println(i); ...①
System.out.println(j); ...②

上記の例では、
①も②もどちらも1と出力されます。

この結果は
予想通りの結果ではないでしょうか。

では、次の例はどうでしょう。

例(その2)

int i = 0;
int j = 0;
int result = 0;

result = i++;
System.out.println(result); ...①
result = ++j;
System.out.println(result); ...②

上記の例では、

①は0
②は1

と出力されます。

なぜ?と思われた方も
いるのではないでしょうか。

陥りやすいミス

なぜこのような結果に
なるのでしょうか。

実は、インクリメント演算子は、
「例(その1)」のように、

単体で使う場合は、
前置も後置も単にオペランドに
1を加算するだけです。

※ディクリメント演算子も同様

しかし、インクリメント演算子を
他の演算子と共に使う場合は
注意が必要です。

「例(その2)」の場合、

result = i++;

は、

(result = i) + 1;

のように、
代入が行われた後に加算が行われます。

※ディクリメント演算子も同様

また、

result = ++j;

は、

result = (j + 1);

のように、

加算が行われた後に代入が行われます。
※ディクリメント演算子も同様

インクリメント演算子を
他の演算子と共に使う場合、

前置と後置では、
加算のタイミングが異なる、
ということになります。

インクリメント(ディクリメント)の
使用頻度は高い

プログラミングにおいて、
インクリメントあるいは
ディクリメントは、
使用頻度が非常に高い演算です。

特に、繰り返し処理などでは、
よく使用されます。

kohsaka

そのため、
この演算子を使用する際には、

・単体での使用なのか、
 他の演算子と併用なのか

・他の演算子と併用の場合は、
 加算のタイミングを考慮

上記の点に
注意するようにしてください。
------------------------------------------------
PS.学習&就職サポートが充実!憧れのエンジニアへ!
社会人のためのJavaスクール
------------------------------------------------

演算子の種類

以前に「演算子」についてお話をしました。

ソースコード上で
演算(計算)をするための記号が「演算子」です。

一般的なプログラミング言語では、
約30種類の演算子が定義されています。

これだけある演算子ですが、
大きく3つに分類することができます。

演算子の種類

演算子は、

・単項演算子
・二項演算子
・三項演算子

の3種類に分類することができます。

さて、「項」とは一体何でしょうか。

演算をするためには、
演算の対象となるものが必要になります。

例えば、足し算をする演算子である
「+」の場合、

3 + 5

という使い方をします。

このとき、
「3」や「5」が演算の対象となります。

このような演算の対象となるものを
「項」と言います。

ちなみに「項」のことを
「オペランド」とも言います。

必要とする「項」の数によって
演算子は分類されています。

1つだけ必要とする演算子を
「単項演算子」、

2つ必要とする演算子を
「二項演算子」、

3つ必要とする演算子を
「三項演算子」

と言います。

単項演算子

代表的なものとしては
インクリメント演算子(++)と
呼ばれるものがあります。

インクリメント演算子は、
下記のような形で使います。

i++

上記の例では、
「変数iの値に1を足す」という
演算を行います。

二項演算子

「+」「-」「*」「%」など

四則演算に代表される
数多くの演算子があります。

三項演算子

項が3つ必要な演算子です。

「そんな演算子は知らない」

という方もいるのでは
ないでしょうか。

三項演算子はマイナー?

実は、この三項演算子、
プログラミングの世界では
あまり好んで使われていないようです。

ソースコードが読みにくくなる、
という理由から、

企業によっては、
三項演算子の使用を禁止している
ところもあるようです。

また、
三項演算子が存在しない
プログラミング言語もあります。

例えば、Pythonには、
三項演算子はありません。

このように一見マイナーな
三項演算子ですが、

使い方によっては便利な演算子です。

三項演算子の書式

三項演算子は

「?:」

この1種類しかありません。

書式としては、

 条件式 ? 式1 : 式2

となります。

これは、
条件式を評価して正しければ
(真であれば)式1を返し、
正しくなければ(偽であれば)
式2を返します。

この説明を見て、

「if文と同じでは?」

と思われた方も
いるのではないでしょうか。

しかし、
三項演算子は演算子です。

結果として式を返します。

if文のように
条件に応じた処理を記述するのでは
ない点に注意してください。

例えば、
変数ageが20以上なら"成年"、
変数ageが19以下なら"未成年"
と表示するソースコードを

三項演算子を使って
Java言語風に書くと、
以下のようになります:

String str = null;
str = age >= 20 ? "成年" : "未成年";
System.out.println(str);

※System.out.println()は
 指定したものを画面に
 表示するためのメソッド

上記の場合、
「age >= 20」が条件式となり、
真なら"成年"が返り
変数strに代入され、
偽なら"未成年"が返り
変数strに代入されます。

これは、
三項演算子(?:)のほうが
代入演算子(=)よりも
優先順位が高いため、

先に三項演算子が実行され、
その返り値が代入演算子により
代入されることになります。

上記の例を
if文を使用して書くと、
以下のようになります:

String str = null;
if (age >= 20) {
str = "成年";
} else {
  str = "未成年";
}
System.out.println(str);

見た目には、
三項演算子のほうがif文より
スッキリして見えます。

三項演算子のほうは、
演算子の優先順位を知らないと
読み解くことができません。

このようなことから、
三項演算子を使用すると
ソースコードが読みにくいと言われます。

しかし、個人的には、
好んで良く使用しています。

書き方によっては、
先ほど3行で記述した
三項演算子のソースコードを、
1行で記述することもできます。

System.out.println(age >= 20 ? "成年" : "未成年");

kohsaka

三項演算子は演算子なので、
メソッドの引数に
記述することも可能です。

このように、
ちょっとマニアックな使い方もできる
三項演算子、

機会があれば、
是非使ってみてはいかがでしょうか。

------------------------------------------------
PS.プログラミングの基礎を学ぶ最善の方法とは?
すでに多くの人が
社会人のためのプログラミングスクール
学習を始めています。
------------------------------------------------

分岐処理のすすめ~用途で使い分ける~

From:リスキルテクノロジー 高坂一城
新宿本校にて

プログラムでは、
ある条件に応じて処理を分けたい、
という場面があります。

年齢が20歳以上ならお酒を販売する、
20歳未満ならお酒を販売しないといったものです。

こういったときのために、
プログラミング言語には、

「条件によって処理を分ける」という

機能が用意されています。

この機能が『分岐処理』です。

分岐処理の種類

一般的なプログラミング言語の場合、

『if文』という書き方と、

『switch文』という書き方があります。

if文とswitch文の違い

なぜ、分岐処理には
2つの書き方があるのでしょうか?

実は、どちらの書き方でも、
同じ分岐処理を記述することができます。

(前回のループ処理もそうでしたね)

違いは、書式の違いによる
ソースコードの読みさすさと実行速度です。

また、分岐処理には、

「二分岐」と呼ばれる、
2つの処理のどちらかを実行するものと、

「多分岐」と呼ばれる、
3つ以上の処理のどれか一つを実行するもの
があります。

二分岐

if文の書式(二分岐)

if文による二分岐の分岐処理は、
以下のような書式になります:

if (条件式) {
 条件式が正しい(true)ときの処理
} else {
 条件式が正しくない(false)ときの処理
}

if文は、
条件式を評価した結果が、
trueかfalseかによって
処理を分岐します。

switch文の書式(二分岐)

switch文による二分岐の分岐処理は、
以下のような書式になります:

switch (条件式) {
case n:
 条件式がnのときの処理
 break;
default:
 条件式がn以外のときの処理
 break;
}
※nは整数

switch文は、条件式を評価した結果が、
特定の整数かどうかによって
処理を分岐します。

二分岐の場合の違い

上記の2つの書式から、
二分岐の場合はif文のほうが
ステップ数が少なく見やすくなります。

また二分岐の場合の実行速度は、
if文もswitch文も
どちらもほとんど変わりません。

多分岐

if文の書式(多分岐)

if文による多分岐の分岐処理は、
以下のような書式になります:

if (条件式1) {
 条件式1が正しい(true)ときの処理
} else if (条件式2) {
 条件式2が正しい(true)ときの処理
} else if (条件式3) {
 条件式3が正しい(true)ときの処理
・・・
} else {
 上記以外のときの処理
}

switch文の書式(多分岐)

switch文による多分岐の分岐処理は、
以下のような書式になります:

switch (条件式) {
case i:
 条件式がiのときの処理
 break;
case j:
 条件式がjのときの処理
 break;
case k:
 条件式がkのときの処理
 break;
・・・
default:
 上記以外のときの処理
 break;
}

※i、j、kは異なる整数

多分岐の場合の違い

上記の2つの書式を見てもわかる通り
多分岐の場合もswitch文のほうが
ステップ数は多いですが
ソースコードは読みやすくなります。

また多分岐の場合の実行速度は、
switch文のほうがif文よりも速いと
されています。

if文は条件式を上から順番に
評価していくのに対し、

switch文は
条件式の評価は1度だけで、
あとは同じ数字を見つけるだけ
という違いによるものです。

(内部的には、「テーブルジャンプ」や
「二分探索」という技術が使われている)

if文とswitch文の使い分け

ソースコードの読みさすさと
実行速度から、

・二分岐の場合は、『if文』が適している

・多分岐の場合は、『switch文』が適している

ということが言えます。

しかし、どのプログラミング言語でも
分岐処理を勉強するときには
「if文」がはじめに登場します。

そのためか、
switch文を敬遠する方を
多く見かけます。

最近のプログラミング言語では、
switch文の条件式の評価結果に、
整数以外の値が使える言語も存在します。

kohsaka

例えばJava言語では、
バージョン7以降において、
条件式の評価結果に「文字列」が
扱えるようになりました。

このように利便性も増しています。

ぜひ、多分岐処理の時には
switch文にも挑戦してみてください。

------------------------------------------------
PS.Javaを基礎からしっかり学びたいなら、
社会人のためのJavaスクールで!!
------------------------------------------------

使いこなせば効率的!「ループ処理」とは?

From:リスキルテクノロジー 高坂一城 新宿本校にて プログラムでは、 同じ処理を何度も実行することが しばしばあります。 その時に、同じ処理を何度も プログラムの中に記述することは、 決して効率がいいとは言えません。 一回だけ処理を記述したら、 その処理を何度も繰り返し 実行してくれる機能があると 非常に便利です。 このように 『同じ処理を繰り返し実行する』 機能がプログラミング言語には 用意されています。 この機能が『ループ処理』です。

ループ処理の種類

一言でループ処理と言っても、 プログラミング言語によっては、 数種類用意されています。 一般的な プログラミング言語の場合は、 『for』 という書き方(for文と呼ばれる)と、 『while』 という書き方(while文と呼ばれる) があります。

for文とwhile文の違い

なぜ、 ループ処理には2つの書き方が あるのでしょうか? 実は、どちらの書き方でも、 同じループ処理を記述することができます。 違いは、書式の違いによる 記述の易さです。

for文の書式

for文のよくある使われ方としては、 以下のような書式があります。

for (カウンタの初期化; カウンタのチェック; カウンタの増加) {   繰り返したい処理 }

カウンタと呼ばれる、 今何回目の繰り返しかを表現するもの(変数) に対して、 「カウンタの初期化」で初期値を設定します。 その後、「カウンタのチェック」で カウンタが繰り返すべき回数に 達しているか否かをチェックします。 まだ達していなければ、 「繰り返したい処理」を実行します。 最後に「カウンタの増加」で カウンタの数を増やして、 再度「カウンタのチェック」を行います。 上記を カウンタが繰り返すべき回数に 達するまで実行します。

while文の書式

while文の書式はシンプルで、 以下のようになります。

while (条件式) {   繰り返したい処理 }

「条件式」で条件が成立している間 「繰り返したい処理」を実行します。

for文とwhile文の使い分け

先にある書式の違いから、 以下のようなことがわかると思います。 ・for文は、  『繰り返し回数が決まっている処理』  に適している ・while文は、  『繰り返し回数が決まっていない処理』  に適している 具体的には、  「1000円を年利5%で預金したとき、10年後の預金額を計算するプログラム」 は、for文が適しています。

【参考:プログラム例】  double amount = 1000;  for (int year = 0; year < 10; year++) {   amount *= 1.05;  } amountを表示

また、  「1000円を年利5%で預金したとき、 預金額が2000円を超えるまでの   年数を計算するプログラム」 は、whileが適しています。

【参考:プログラム例】  double amount = 1000;  int year = 0;  while (amount <= 2000) {   year++;   amount *= 1.05;  } yearを表示

このように、 for文とwhile文のどちらを使えばいいか 迷った時には、 繰り返し回数が決まっているかどうかを 基準にしてください。 ただし、どちらの書き方でも、 同じループ処理を記述することができます。 そのため、プログラミング初心者は、 まず自分が書き易いほうでプログラミングを してみましょう。

kohsaka

そして、 少しプログラミングに慣れてきたら、 どちらを使うか検討してみてください。 このような 勉強の仕方がいいのではないでしょうか。 ------------------------------------------- PS.Javaを基礎からしっかり学びたいなら、 社会人のためのプログラミングスクールで!! -------------------------------------------

未経験からの育成制度も充実
IT講師に興味はありませんか?

リスキルテクノロジーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する