3.

C++で変数を宣言する方法|型・初期化・autoと未初期化の注意

編集

C++で変数を宣言するには、「型 変数名 = 初期値;」のように、データの種類を表す「型」と「変数名」を書きます。たとえば整数を入れる変数なら int x = 5; のように書き、これで x という名前の整数変数が値 5 で使えるようになります。

 

この記事の要点
  • 基本の形は 型 変数名 = 初期値;。例: int x = 5;
  • よく使う型は int(整数)、double(小数)、char(1文字)、bool(真偽)、std::string(文字列)。
  • 初期化には int x = 5; のほか、波かっこを使う統一初期化 int x{5};、かっこを使う int x(5); がある。
  • auto x = 5; と書くと初期値から型が自動で決まる(型推論)。
  • 変更しない値は const を付けて定数にできる(→ 定数の宣言)。
  • 未初期化の変数は値が定まらない(不定値)ため、必ず初期化してから使う。

 

基本の書き方

C++では、変数を使う前に「どんな種類のデータを入れるか」を表すとともに宣言します。もっとも基本的な形は次のとおりです。

型 変数名 = 初期値;

 

たとえば、整数を入れる変数 x を 5 という値で宣言するには次のように書きます。宣言と同時に初期値を与えることを初期化と呼びます。

#include <iostream>

int main() {

    int x = 5;

    std::cout << x << std::endl;

    return 0;

}

 

5

 

初期値を省略して int x; とだけ書くこともできますが、その場合の値は定まりません(後述の「落とし穴」を参照)。原則として、宣言と同時に初期化することをおすすめします。

主な型

変数の型によって、入れられる値の種類や扱える範囲が変わります。C++でよく使う基本的な型は次のとおりです。

扱うデータ 宣言の例
int 整数 int n = 10;
double 小数(実数) double pi = 3.14;
char 1文字 char c = 'A';
bool 真偽(true / false) bool ok = true;
std::string 文字列 std::string s = "hello";

 

char'A' のようにシングルクォートで1文字を、std::string"hello" のようにダブルクォートで文字列を表します。std::string を使うには #include <string> が必要です。

初期化の書き方

C++では初期値の与え方が複数あります。次の3つはいずれも、値 5 で int 型の変数 x を初期化します。

    int x = 5;    // 代入の形(もっとも基本)

    int x{5};     // 統一初期化(波かっこ)

    int x(5);     // かっこによる初期化

 

このうち波かっこ {} を使う書き方を統一初期化(リスト初期化)と呼びます。さまざまな型で同じ書き方が使えるうえ、値が型に収まらない場合(たとえば小数を整数に詰めるなど)に警告やエラーになりやすく、意図しない値の切り捨てを防ぎやすいという利点があります。新しく書くコードでは {} を用いる書き方が推奨されることが多いです。

auto による型推論

型のところに auto と書くと、コンパイラが初期値から型を自動的に判断します。これを型推論と呼びます。次の2つは同じ意味です。

    auto x = 5;      // int と推論される

    auto pi = 3.14;  // double と推論される

    auto s = std::string("hi"); // std::string

 

auto は型名が長くなりがちな場面でコードを簡潔にできますが、初期値が必須です。初期値がなければ型を決められないため、auto x; はエラーになります。何の型になるか読み手に伝わりにくくなる場合もあるので、わかりやすさとのバランスで使い分けます。

const による定数

宣言時に const を付けると、その変数はあとから値を変更できない「定数」になります。設定値や円周率のように、書き換えてはいけない値に使うと安全です。

    const int MAX = 100;

    // MAX = 200;  ← エラー(変更できない)

 

定数の宣言については、定数の宣言でより詳しく解説しています。

変数のスコープ(有効範囲)

変数には、その変数が使える範囲であるスコープがあります。波かっこ { } の中で宣言した変数は、その中だけで有効なローカル変数になり、かっこを抜けると使えなくなります。一方、関数の外で宣言した変数はグローバル変数となり、プログラム全体から参照できます。

#include <iostream>

int g = 100;         // グローバル変数

int main() {

    int local = 5;  // ローカル変数(main の中だけ)

    std::cout << g + local << std::endl;

    return 0;

}

 

105

 

グローバル変数はどこからでも書き換えられるため、どこで値が変わったか追いにくくなりがちです。基本的には必要な範囲だけで使えるローカル変数を優先し、グローバル変数は最小限にとどめるとよいでしょう。

よくある落とし穴

落とし穴 説明
未初期化変数の不定値 int x; のように初期化せずに宣言したローカル変数の値は定まりません(不定値)。その値を読むと結果が予測できないため、必ず初期化してから使います。
暗黙の型変換 int n = 3.9; のように小数を int に入れると、小数部が切り捨てられて 3 になります。意図しない値になりやすい点に注意します。統一初期化 int n{3.9}; なら警告やエラーになりやすく、ミスに気づけます。
シャドーイング(変数の隠れ) 内側のスコープで外側と同じ名前の変数を宣言すると、内側ではそちらが優先され、外側の変数が一時的に見えなくなります。どちらを指しているか紛らわしいバグの原因になります。

 

シャドーイングの例を示します。同じ x という名前でも、内側の波かっこの中では新しく宣言した方が使われます。

#include <iostream>

int main() {

    int x = 1;

    {

        int x = 2;  // 外側の x を隠す

        std::cout << x << std::endl;  // 2

    }

    std::cout << x << std::endl;      // 1

    return 0;

}

 

よくある質問(FAQ)

Q. 宣言と初期化は何が違いますか?
A. 宣言は「この名前でこの型の変数を使う」とコンパイラに伝えることです。初期化は宣言と同時に最初の値を与えることを指します。int x; は宣言のみ、int x = 5; は宣言と初期化を同時に行っています。値が定まらない事故を避けるため、宣言と同時に初期化するのが基本です。

Q. int x = 5;int x{5}; はどちらを使うべきですか?
A. どちらも結果は同じ整数変数になります。波かっこ {} を使う統一初期化は、値が型に収まらない場合に警告やエラーになりやすく、意図しない切り捨てを防ぎやすい利点があります。新しいコードでは {} を選ぶとより安全です。

Q. auto はいつ使えばよいですか?
A. 初期値から型が明らかな場合や、型名が長くて記述が冗長になる場合に便利です。ただし auto は初期値が必須で、読み手に型が伝わりにくくなることもあるため、可読性とのバランスで使い分けます。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. コメントアウト
  2. 文字列の結合/連結
  3. 変数の宣言
  4. 定数の宣言
  5. if文
  6. if文の論理演算子
  7. for文
  8. データ型(文字列以外)
  9. データ型(文字列)
  10. 配列とfor文
  11. 配列の要素数
  12. 多次元配列とfor文
  13. 多次元配列の要素数
  14. 関数の定義と呼び出し

最近更新/作成されたページ