03_変数とデータ型

はじめに

この章では、整数、小数、文字、真偽値、文字列といった基本的なデータ型と、変数を使ってプログラムに値を保持する方法を学びます。また、C++の << 演算子が型ごとに適切に処理を変える仕組みにも触れていきます。

いろいろなデータ型

型名 説明
int 整数 10, -5, 0
double 実数(小数) 3.14, -0.5
char 1文字 'A', 'z'
bool 真偽値(true/false) true, false
string 文字列 "Hello", "C++"

string 型を使うには <string> をインクルードする必要があります。

変数に値を保持して表示する

#include <iostream>
#include <string>
using namespace std;

int main() {
    int score = 90;
    double rate = 0.85;
    char grade = 'A';
    bool isPassed = true;
    string name = "Tanaka";

    cout << "名前: " << name << endl;
    cout << "スコア: " << score << endl;
    cout << "レート: " << rate << endl;
    cout << "評価: " << grade << endl;
    cout << "合格か?: " << isPassed << endl;

    return 0;
}

解説

変数はいつ宣言する?(C++のスタイル)

上の例では、各変数を 宣言すると同時に値を入れて(初期化して) います。C++ではこれが基本のスタイルです。ポイントは2つです。

// ◎ おすすめ:使う直前に、初期値つきで宣言する
int score = 90;
string name = "Tanaka";

// △ 避けたい:先に宣言だけして、あとで代入する
int score;        // この時点では中身が未定(未初期化)
// ...いろいろな処理...
score = 90;       // ずっと後で値を入れる
なぜ「宣言と同時に初期化」するのか:
初期値を入れずに宣言すると、うっかり中身が未定のまま使ってしまうバグが起きやすくなります。 宣言と同時に値を入れておけば、その心配がありません。
C言語(特に古い規格)には「関数の先頭でまとめて変数を宣言する」習慣がありました。 C++では 使う場所で宣言してよい ので、上のスタイルが基本です。 変数の「使える範囲(スコープ)」を狭くできる利点については、07_繰り返し処理 の for 文のところで詳しく扱います。

演算子オーバーロードのしくみ

C++では、演算子 <<>> の振る舞いを、扱う型ごとに切り替える機能があります。これを「演算子オーバーロード」と呼びます。

これにより、型ごとに特別な処理を意識せずに、同じ書き方で出力できます。

bool型の文字表示(true/false)

#include <iostream>
using namespace std;

int main() {
    bool isClear = true;

    cout << isClear << endl;               // 数値として表示(1)
    cout << boolalpha << isClear << endl;  // 文字として表示(true)

    return 0;
}

解説

マニピュレータとは

boolalphaマニピュレータ(Manipulator) と呼ばれる機能の一つです。マニピュレータとは、cout などの出力の設定を変更する仕組みです。

cout << boolalpha << true << ", " << false << endl;    // true, false
cout << noboolalpha << true << ", " << false << endl;  // 1, 0
他にも fixedsetprecision など、表示形式を変えるマニピュレータがあります。

コーディング演習

演習1:基本コードを動かす

03_01_types.cpp を作成し、次のコードを入力して実行しましょう。
// types.cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    int age = 25;
    double height = 170.5;
    char initial = 'T';
    bool isMember = true;
    string name = "Tanaka";

    cout << "名前: " << name << endl;
    cout << "年齢: " << age << endl;
    cout << "身長: " << height << endl;
    cout << "イニシャル: " << initial << endl;
    cout << "会員: " << boolalpha << isMember << endl;
    return 0;
}

演習2:コードを改造する

03_01_types.cpp をコピーして 03_02_types_mod.cpp として保存し、次の変更を加えてみましょう:
ヒントを見る bool isGood = (score >= 80); のように比較演算子の結果を直接 bool 変数に代入できます。
boolalpha は一度指定すると以降全ての bool 出力に影響します。

理解度チェック

問題03-1

次のコードを実行した場合の出力として正しいものはどれか。

#include <iostream>
#include <string>
using namespace std;

int main() {
    int age = 25;
    string name = "Sato";
    bool isMember = false;

    cout << "名前: " << name << endl;
    cout << "年齢: " << age << endl;
    cout << "会員ですか?: " << isMember << endl;
    return 0;
}
解説を表示 正解:ア
boolalpha を使っていないため、false0 として表示されます。boolalpha を使うと "false" と表示されます。

問題03-2

double rate = 0.85; と宣言した後、cout << rate << endl; の出力はどれか。

解説を表示 正解:ウ
double 型の変数はそのまま小数値が出力されます。cout の演算子オーバーロードにより、型に合った出力が自動的に行われます。

問題03-3

次のコードを実行したとき、最後の出力はどれか。

#include <iostream>
using namespace std;
int main() {
    bool x = true;
    cout << boolalpha << x << endl;
    cout << noboolalpha << x << endl;
    return 0;
}
解説を表示 正解:イ
1行目の boolalpha で "true" が出力されますが、2行目の noboolalpha でリセットされるため、2行目の出力は 1 になります。

問題03-4

char grade = 'A'; について正しい説明はどれか。

解説を表示 正解:イ
char 型は1文字を格納します。文字リテラルはシングルクォート('A')で囲みます。ダブルクォート("A")は文字列リテラルなので char に代入するとエラーになります。

まとめ