新人編集者のJava学習物語 初級編

新人編集者のJava学習物語 初級編

第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回になった時点でカウント終了という意味だよね。公式からそれは分かる。

でも、1個変な式がある。先生! このソースコードですけど、a = a + bなんて式、あり得なくないですか? aにbを足したらaになるわけないもん

先生

このイコールは数学でいうイコールとは違うんですよ。Javaのイコールは、「右辺の演算式を左辺に代入する」という意味なんです(参照:ソースコード2)


a = a + 1;	 // aに1を足したものをaに代入する

b + 1 = a + 1;	 // エラーになる

ソースコード2


先生

ただし、演算式は必ず右辺に置かれます。数学のように左辺に演算式を置くことはできません。これはイコールが代入を表しているからですね。

以下のように、ソースコード3と4は同じ意味です


a = 123;
b = 123;
c = 123;
d = 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
C:\Java2\S5>java Keisan
5 ÷ 2 = 2


ソースコード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
C:\Java2\S6>java Keisan
4 ÷ 2 = 2


ソースコード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自分戦略研究所をよろしくお願いいたします。