連載
» 2006年06月28日 10時00分 公開

JavaTips 〜Javaプログラミング編:カウンタ操作をfor文に移動したら結果が異なる

[平野正喜,@IT]

 for文で、複数のカウンタを操作しながら繰り返しを行う場合、「for(int i = 0, j = 0; i < 9; i++, j++)」というように、両方を第3項(反復式)に記入したほうが見やすくなる場合があります。しかし、この時、反復式に他の変数や定数を用いる場合は注意が必要です。例えば、下記のような2つの変数を増加させる繰り返しを行うプログラムがあるとします。

画面1 変更前と実行結果 画面1 変更前と実行結果

 この繰り返しの最後にある変数jの操作を、前述の理由でfor文の第3項に移したところ、なんと、違う結果になってしまいました。

画面2 変更すると異なる実行結果に 画面2 変更すると異なる実行結果に

実はインタフェースのおかげでエラーにならなかっただけ

 この違いが発生した原因は、定数「CNTUP」にあります。実は、このクラスが実装しているインタフェースに同じ名前の定数が定義されていたので、変更後には、ローカルの定数「CNTUP」が無視されてしまったのです。

画面3 インタフェースを開いてみると 画面3 インタフェースを開いてみると

 よって、もし、このインタフェースが実装されてなければ、変数jの操作をfor文の第3項に移した段階でコンパイルエラーになるはずでした。

画面4 本来はコンパイルエラー 画面4 本来はコンパイルエラー

 この現象からも、for文の第3項はそれより前に定義済みの変数や定数しか使えないことがわかります。正確には、同じfor文の第1項(初期化部)までに定義されているかどうかがチェックされます。

 for文の第3項は、実際に実行されるタイミングがforブロックの内容の後ですので、forブロックの内部で定義された変数や定数を利用できそうに見えますが、そうではありません。この例のようにコンパイルエラーにならない場合、発見が困難ですので注意が必要です。

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。