入力と変数 解答ページ | Programming Place Plus 新C++編

トップページ新C++編入力と変数

このページの概要

このページは、練習問題の解答例や解説のページです。



解答・解説

問題1 (確認★)

次のプログラムの間違いを指摘してください。

#include <iostream>

int main()
{
    constexpr auto value = 100;

    std::cin >> value;

    std::cout << value << "\n";
}


プログラムを実行した後、キーボードからの入力によって与えられた整数を扱いたいので、value は変数でなければなりません。constexpr変数は、コンパイル時に値が確定するものであって、入力された値を受け取る場所にはならないのです(本編解説)。

問題2 (確認★)

次のプログラムを実行すると、どのような結果になりますか?

#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

問題3 (基本★★)

整数の入力を1つだけ受け取り、次の3つの数を出力するプログラムを作成してください。

  1. 入力された整数そのもの
  2. 入力された整数を 10倍した数
  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

問題4 (基本★★)

整数の入力を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 でないときだけ除算をおこなう」といったことが可能です。

問題5 (調査★★★)

変数を宣言するとき、次のように、初期値の記述を省略することができます。

int age;

この場合、どのような意味になるのか調べてみて下さい(C言語や C++98/03 の経験者は分かっていると思いますので、この問題は取り組まなくて結構です)。


初期値の指定を完全に省略した宣言では、その変数の値はまったくの不定な状態になります。プログラムを実行するたびに、違う値になる可能性すらあります。

【上級】静的ストレージ期間をもつ変数の場合は、型に応じたデフォルト値で初期化されることが保証されます。

変数に初期値を設定するという行為は基本的に、プログラムを実行したあとに行われるものであり、処理に時間がかかる行為です。その時間は非常にわずかなものですが、入力によって値が与えられると分かっている変数に、わざわざ 0 などの初期値を与えることは無駄といえば無駄です。C++ は速度的な効率を重視するプログラミング言語なので、あえて初期値を与えないという選択ができるようになっています。

しかし、変数の値が不定な状態であるというのは、バグの原因になりかねません。あるときはたまたまうまく動いても、いつか突然おかしくなる可能性もあります(前述した「プログラムを実行するたびに、違う値になっている可能性すらあります」という一文を思い出してください)。

初期値を設定することにかかる時間はごくわずかなので、わずかな効率向上のために、プログラムに危険性を入れ込む必要はありません。原則として、変数には明確な初期値を与えるようにします。


参考リンク



更新履歴




はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る