第2回 a=a+bなんてあり得なくない?
荒井亜子
2007/11/08
編集長にダメの烙印(らくいん)を押された新人編集者が、業務の合間に身を削って、必死でプログラミングを学習し、学んだことを皆さんにお伝えする連載。「こんな奴でも頑張っているのか」と、これからJavaを始める人や、一度Javaで挫折をした人にはぜひ読んで糧にしていただきたい。記事の最後には、Javaの講師よりアドバイスを掲載 |
|
連載第1回「変数って、変な数のことでしょ」では、主にプログラミングとは何か、Javaとは何かについて学習した新人編集者だが、連載第2回では、Javaの文法に触れる。まずは、制御文について講義を受け、「制御文なんて公式さえ覚えれば楽勝」と楽観視していた新人編集者だが、すぐさま思わぬところでつまずく結果となる。
■for文とwhile文、どう違うの?
先生 | 制御文は、文法をしっかり押さえましょう |
繰り返し文の構造 |
■for文 for(初期化の式;反復条件の式;後処理の式) { 反復条件の式がtrueの間、繰り返す処理 } |
■while文 while(反復条件の式) { 反復条件の式がtrueの間、繰り返す処理 } |
荒井 | for文もwhile文も繰り返し文と書いてあるけど、何が違うの? 先生 |
先生 | for文を使った繰り返しは、ループカウンタで回数をカウントしながら行われるものですが、回数を明確に定義できない繰り返しを行いたい場合もあります。その場合はwhile文を使います。例えば、銀行の金利計算で、100万円までは5%の金利を付けるときなどに使うと便利です |
荒井 | なるほど。for文とwhile文の違いが分かったし、制御文は公式さえ覚えてしまえば楽勝じゃん |
■Javaのイコールは数学とは違うんだ……
先生 | 制御文を使った、1から10までの和を求めるプログラミングは以下(ソースコード1)のようになります。 |
class Sum { public static void main (String[] args) { int a = 0; int b; for (b = 1; b <= 10; b++) { a = a + b; } System.out.println("1から10までの和は " + a); } } |
ソースコード1 |
荒井 | うんうん。このソースコードにあるfor文の条件式の部分は、1から10の数字を10回までカウントして、11回になった時点でカウント終了という意味だよね。公式からそれは分かる。 |
先生 | このイコールは数学でいうイコールとは違うんですよ。Javaのイコールは、「右辺の演算式を左辺に代入する」という意味なんです(参照:ソースコード2) |
a = a + 1; // aに1を足したものをaに代入する b + 1 = a + 1; // エラーになる |
ソースコード2 |
先生 | ただし、演算式は必ず右辺に置かれます。数学のように左辺に演算式を置くことはできません。これはイコールが代入を表しているからですね。 以下のように、ソースコード3と4は同じ意味です |
a = 123; |
ソースコード3 |
a = b = c = d = 123;// 変数a、b、c、dに123を代入する |
ソースコード4 |
荒井 | そうか、Javaのイコールは数学とは違うんだ……。頭を切り替えなきゃ |
詳しくはこちら⇒Javaの反復処理を理解する「Eclipseではじめるプログラミング(5)」
■コンピュータの限界を突き止めてしまった
休憩時間での出来事。
荒井 | 少しずつソースコードにも慣れてきたし、自分でプログラムを作ってみようかな。さっき習った計算の演算子、試してみたい |
class Keisan{ public static void main(String[] args){ System.out.println("5 ÷ 2 = " + 5/2); } } |
ソースコード5 |
荒井 | よし、これ(ソースコード5)をコンパイルして、実行しよう |
C:\Java2\S5>javac Keisan.java |
ソースコード5の実行結果 |
荒井 | 5 ÷ 2って、2じゃないよね……。いくら私でもそれくらいの計算は分かる。とすると、あれれ? おかしいな。ほかの式でもやってみよう |
class Keisan{ public static void main(String[] args){ System.out.println("4 ÷ 2 = " + 4/2); } } |
ソースコード6 |
ソースコード6をコンパイルして実行する。実行結果は以下の通りだ。
C:\Java2\S6>javac Keisan.java |
ソースコード6の実行結果 |
荒井 | どうやら、ソースコードが間違っているわけではなさそうだな。コンピュータってもともと計算機でしょ。コンピュータが計算間違えるなんて信じられない。もしかして、これって世紀の大発見? 先生に教えてあげよう |
新人編集者は、即座に先生のもとへ駆け寄る。
荒井 | 先生、すごいことを発見しました |
先生 | どうしましたか? |
荒井 | コンピュータは5 ÷ 2 = 2.5を計算できないんです!! |
先生 | もしそれが本当なら大変ですね。でも、まずは荒井さんの書いたソースコードを見せてくれるかな? |
先生はソースコードを見るやいなや、新人編集者の勘違いに気付いた様子。
先生 | うん、いいところに気付いたね |
荒井 | やっぱり? 1日目にしてコンピュータの限界を突き止めてしまった、先生、自分の能力が恐ろしいです |
先生 | あはは、着眼点はいいけどコンピュータの限界はそんなものじゃないですよ。Javaでは、整数同士で計算すると、その計算結果は整数になるんです。だから、ちょっと変な結果になってしまったんですね。答えの型に数字をそろえて『5.0/2.0』にして、もう1回コンパイルしてみましょう! |
すると、答えが2.5となる。
先生 | 異なる型で計算するときは、型の変換を行わないといけません。例えば、下のソースコード7のように、int型はfloat型にキャストを行わないといけません |
class Cast{ public static void main(String[] args){ System.out.println("5 ÷ 2 =" + (float)5/2); } } |
ソースコード7 |
荒井 | 小さい型から大きい型なら変換はいらないけど、大きい型を小さい型に代入するときは、型変換が必要なんですね。また私の早とちりだったのか。先生ごめんなさい |
新人編集者、演習問題でまた一騒動! |
今回のインデックス |
新人編集者のJava学習物語 初級編(2) (1ページ) |
新人編集者のJava学習物語 初級編(2) (2ページ) |
@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。
現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。
これからも、@IT自分戦略研究所をよろしくお願いいたします。