このページは、練習問題の解答例や解説のページです。
次のプログラムの間違いを指摘してください。
#include <iostream>
int main()
{
constexpr auto value = 100;
std::cin >> value;
std::cout << value << "\n";
}
プログラムを実行した後、キーボードからの入力によって与えられた整数を扱いたいので、value は変数でなければなりません。constexpr変数は、コンパイル時に値が確定するものであって、入力された値を受け取る場所にはならないのです(本編解説)。
次のプログラムを実行すると、どのような結果になりますか?
#include <iostream>
int main()
{
int value1 {};
int value2 {value1 + 10};
std::cout << value1 << "\n";
std::cout << value2 << "\n";
}
変数を宣言するとき、初期値を {}
と書いた場合、型に応じたデフォルトの値で初期化されます。型が int
の場合には 0 です(本編解説)。
ですから、value1 の値は 0 です。
続いて、value2 を宣言していますが、その初期値は
{value1 + 10}
となっています。value1 の値は 0
ですから、value2 の初期値は「0 + 10」で 10 になります。
あとは、value1、value2 それぞれの値を出力しているだけなので、実行結果はこうなります。
実行結果:
0
10
整数の入力を1つだけ受け取り、次の3つの数を出力するプログラムを作成してください。
たとえば、次のように作成できます。
#include <iostream>
int main()
{
std::cout << "Please enter an integer.\n";
int value {};
std::cin >> value;
std::cout << value << "\n";
std::cout << value * 10 << "\n";
std::cout << -value << "\n";
}
実行結果:
Please enter an integer.
123 <-- 入力した整数。最後に Enterキーを押している
123
1230
-123
符号を反転させるには、この解答例のように負符号演算子(-
)を使うか、value * -1
のように、-1 を乗算すればいいです。
負数を入力した場合も確認しておきます。
実行結果:
Please enter an integer.
-123 <-- 入力した整数。最後に Enterキーを押している
-123
-1230
123
整数の入力を2つ受け取り、2つの数を、加算・減算・乗算・除算した数を出力するプログラムを作成してください(除算のときには注意すべき点がありますが、分かりますか?)
たとえば、次のように作成できます。
#include <iostream>
int main()
{
std::cout << "Please enter two integers.\n";
int value1 {};
int value2 {};
std::cin >> value1 >> value2;
std::cout << value1 + value2 << "\n";
std::cout << value1 - value2 << "\n";
std::cout << value1 * value2 << "\n";
std::cout << value1 / value2 << "\n";
}
実行結果:
Please enter two integers.
20 5 <-- 入力した整数。あいだにスペースキー、最後に Enterキーを押している
25
15
100
4
「除算のときには注意すべき点」とは、ゼロ除算です。「乗算と除算」のページで解説したとおり、整数のゼロ除算は未定義動作なので避けなければなりません。
これは、「入力処理の難しさ」のところで取り上げた、想定外のデータが入力される可能性とも関係します。0 が入力されてしまうこと自体は止めようがありません。しかし、それをそのまま受け入れて 0 で除算してしまうと、未定義動作ですから、どんな結果になるかまったく分かりません。
現在までの知識では対処のしようがないので、これ以上踏み込みませんが、いずれこのようなケースもきちんと対処できるようになる必要があります。
【上級】たとえば、if という文法機能を使うと、変数の値に応じて、実行する処理を切り替えることができます。「2つ目の数が 0 でないときだけ除算をおこなう」といったことが可能です。
変数を宣言するとき、次のように、初期値の記述を省略することができます。
int age;
この場合、どのような意味になるのか調べてみて下さい(C言語や C++98/03 の経験者は分かっていると思いますので、この問題は取り組まなくて結構です)。
初期値の指定を完全に省略した宣言では、その変数の値はまったくの不定な状態になります。プログラムを実行するたびに、違う値になる可能性すらあります。
【上級】静的ストレージ期間をもつ変数の場合は、型に応じたデフォルト値で初期化されることが保証されます。
変数に初期値を設定するという行為は基本的に、プログラムを実行したあとに行われるものであり、処理に時間がかかる行為です。その時間は非常にわずかなものですが、入力によって値が与えられると分かっている変数に、わざわざ 0 などの初期値を与えることは無駄といえば無駄です。C++ は速度的な効率を重視するプログラミング言語なので、あえて初期値を与えないという選択ができるようになっています。
しかし、変数の値が不定な状態であるというのは、バグの原因になりかねません。あるときはたまたまうまく動いても、いつか突然おかしくなる可能性もあります(前述した「プログラムを実行するたびに、違う値になっている可能性すらあります」という一文を思い出してください)。
初期値を設定することにかかる時間はごくわずかなので、わずかな効率向上のために、プログラムに危険性を入れ込む必要はありません。原則として、変数には明確な初期値を与えるようにします。
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |