C++言語講座 第1章 5回 if文とif~else文、オブジェクトの使える範囲
if文とif~else文
制御文
今まで作って来たプログラムは、main()関数の中だけを見てみると、全て上の行から順番に、一つも処理を飛ばさず実行しているプログラムばかりでした。しかし、実際のプログラムはそうではありません。ゲーム一つを取ってみても、Aボタンが押されたら、弾を発射だの、残機数が無くなるまで、同じステージを何度でも繰り返すだのといった処理が必要になります。このためには、プログラムが実行される順番を制御する必要があります。これを行うためにあるのが、制御文です。 制御文には色々な種類がありますが、まず簡単なものから説明しましょう。
if文
もし○○だったら、××を実行せよ
などという処理をするためにあるのが、if文です。ifというのは英語で「もしも」という意味ですね。まず簡単な例を見てみましょう。
[List 1]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x;
7
8 cout << "箱が三つあります。一つだけがあたりです。"
9 << "あたりはどれでしょう。(1~3の整数で)" << endl;
10 cin >> x;
11
12 if (x == 3) {
13 cout << "あたり" << endl;
14 }
15
16 return 0;
17 }
実行してみれば分かるように、3 と入力すると、
あたり
と表示されます。ちがう数字を入力すると、何も表示されません。
1 if (x == 3) { … }
というところが、if文です。if文は ( ) の中が正しい(成り立つ)ときだけ、{ } の中を実行します。ここで、
1 x == 3
というのは、x が 3 のとき、という意味です。代入するときは = と書きましたが、このようにあるオブジェクトが別のオブジェクトに等しいかどうか、というときは、区別するために == というように、イコールをふたつ続けて書きます。
{ } の中には、何行でも実行したい処理を書くことが出来ます。[List 1] の if 文を以下のように書き換えてみましょう。
1 if (x == 3) {
2 cout << "あたり" << endl;
3 cout << "やったね!" << endl;
4 }
これでは少しさびしいので、はずれた場合(つまり、3以外の数を入力した場合) は「はずれ」と表示させましょう。
[List 2]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x;
7
8 cout << "箱が三つあります。一つだけがあたりです。"
9 << "あたりはどれでしょう。(1~3の整数で)" << endl;
10 cin >> x;
11
12 if (x == 3) {
13 cout << "あたり" << endl;
14 cout << "やったね" << endl;
15 }
16
17 if (x != 3) {
18 cout << "はずれ" << endl;
19 cout << "残念…" << endl;
20 }
21
22 return 0;
23 }
x != 3 というのは、x が 3 じゃないとき、という意味です。!= は数学でいうと ≠ と同じ意味なんですね。
if~else文
上の[List 2]ですが、実はもうちょっと短く、分かりやすく書くことが出来ます。「x == 3 のときは『あたり』と、違えば『はずれ』と表示したい」のですよね。この「違えば」というのを表すのがif~else文です。
[List 3]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x;
7
8 cout << "箱が三つあります。一つだけがあたりです。"
9 << "あたりはどれでしょう。(1~3の整数で)" << endl;
10 cin >> x;
11
12 if (x == 3) {
13 cout << "あたり" << endl;
14 cout << "やったね" << endl;
15 } else {
16 cout << "はずれ" << endl;
17 cout << "残念…" << endl;
18 }
19
20 return 0;
21 }
つまり、
1 if (x == 3) { … } else { ~ }
と書くと、x == 3 のとき { … } を、違うとき { ~ } を実行する、ということです。
でも、もうちょっともの足りませんね。例えば、箱は1~3までの三つしかないのに、例えば 5 だとか -10 だとか、存在しない番号を入力した場合に、「そんな箱ないがな!」と怒るように、プログラムを変えてみましょう。
[List 4]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x;
7
8 cout << "箱が三つあります。一つだけがあたりです。"
9 << "あたりはどれでしょう。(1~3の整数で)" << endl;
10 cin >> x;
11
12 if (x == 3) {
13 cout << "あたり" << endl;
14 cout << "やったね" << endl;
15 } else {
16 if (x < 1 || 3 < x) {
17 cout << "そんな箱ないがな!" << endl;
18 } else {
19 cout << "はずれ" << endl;
20 cout << "残念…" << endl;
21 }
22 }
23
24 return 0;
25 }
1 x < 1 || 3 < x
とはどんな意味でしょう。x < 1 は「x が 1 より小さかったら」、3 < x は「x が 3 より大きかったら」という意味ですね。その間の || は「または」という意味です。つまり、「x < 1 または 3 < x」ならば、{ } の中を実行する、ということです。同じように、「○○でしかも○○ならば」と書きたいときには || の代わりに && と書きます。
ここで使った比較演算子は == (等しい)、!= (等しくない)、< (小なり)だけでしたが、他にも > (大なり)、<= (小なりイコール)、>= (大なりイコール)があります。上のプログラムを色々いじって遊びましょう。
一行だけの条件分岐
いままで、if文やif~else文で、実行したい処理は { } でくくっていましたが、これは { } 内が1行だけのときは { } は必要ありません。例えば、
[List 5]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x;
7
8 cout << "箱が三つあります。一つだけがあたりです。"
9 << "あたりはどれでしょう。(1~3の整数で)" << endl;
10 cin >> x;
11
12 if (x == 3)
13 cout << "あたり" << endl;
14 else {
15 if (x < 1 || 3 < x)
16 cout << "そんな箱ないがな!" << endl;
17 else
18 cout << "はずれ" << endl;
19 }
20
21 return 0;
22 }
というように。これ、もうちょっと省略できて、
[List 6]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x;
7
8 cout << "箱が三つあります。一つだけがあたりです。"
9 << "あたりはどれでしょう。(1~3の整数で)" << endl;
10 cin >> x;
11
12 if (x == 3)
13 cout << "あたり" << endl;
14 else if (x < 1 || 3 < x)
15 cout << "そんな箱ないがな!" << endl;
16 else
17 cout << "はずれ" << endl;
18
19 return 0;
20 }
のようにもかけます。
オブジェクトの使える範囲
以下のプログラムをコンパイルしてみましょう。
[List 7]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int x = 10;
7
8 if (x == 10) {
9 int y = 20;
10 }
11 cout << y << endl;
12
13 return 0;
14 }
エラーになってしまったと思います。問題はオブジェクト y です。y を宣言しているのは、if文の { } の中ですが、それを表示しようとしているのは、{ } の外側です。実は、{ } の中で宣言したオブジェクトは、同じ { } の中でしか使えないのです。実際、
1 cout << y << endl;
をif文の { } の中に入れると、問題無くコンパイルできると思います。このように、オブジェクトの使える範囲のことを、オブジェクトのスコープ (scope)と呼びます。
