E - 1.04.変数と型 /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

  • 変数は「メモ」
  • =は代入
  • 「データの種類」のことをという
書き込むデータの種類
int 整数
double 小数
string 文字列

変数

変数という機能について見ていきましょう。変数は「メモ」だと考えて下さい。
一度使ったデータをまた後で使いたいときのために、名前を付けてメモをして覚えておくというものです。
変数のイラスト

例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int main() {

  int name;

  name = 10;

  cout << name << endl;     // 10
  cout << name + 2 << endl; // 10 + 2 → 12
  cout << name * 3 << endl; // 10 * 3 → 30
}
実行結果
10
12
30

宣言

変数を使うには、最初に宣言を行う必要があります。
変数を宣言するときは、「データの種類」と「変数の名前」を指定します。

int name;

「整数」のデータを書き込む変数を「name」という名前で宣言しています。
intの部分がデータの種類が整数だと指定している部分です。

「データの種類」のことを型(かた)と言い、「変数の名前」のことを変数名と言います。型についての詳しい説明はこの節の後半で行います。
また、「データ」のことを値(あたい)と言うこともあります。今後この表現を使うこともあるので覚えておきましょう。

代入

宣言した変数にデータをメモするには、以下のように=を使って代入をします。

name = 10;

これでnameという名前の変数に10が書き込まれます。

C++の =は代入 であって、「等しい」という意味ではないということに注意して下さい。

読み込み

main関数の最後の3行で変数にメモした値を読み込んで出力しています。

cout << name << endl;     // 10
cout << name + 2 << endl; // 10 + 2 → 12
cout << name * 3 << endl; // 10 * 3 → 30

変数の値を読み書きすることを「変数にアクセスする」ということもあります。

変数の初期化

変数の宣言と代入は同時に行うこともできます。

#include <bits/stdc++.h>
using namespace std;

int main() {

  int name = 10;

  cout << name << endl;
}
実行結果
10

変数を宣言した後の最初の代入を初期化といいます。上のプログラムで変数name10に初期化されています。

変数はコピーされる

変数1 = 変数2と書いた場合、変数の値そのものがコピーされます。
その後にどちらかの変数の値が変更されても、もう片方の変数は影響を受けません。

#include <bits/stdc++.h>
using namespace std;

int main() {

  int a = 10;
  int b;
  b = a; // aの値がコピーされ、bに10が代入される
  a = 5; // aの値は5に書き換わるが、bは10のまま

  cout << a << endl; // 5
  cout << b << endl; // 10
}
実行結果
5
10

変数bが10のままであることに注意してください。
7行目から9行目の処理を図で説明すると以下のようになります。

コピーされる変数のイラスト

変数を同時に宣言

変数の宣言時に,を間に入れることで複数の変数を同時に宣言することもできます。

#include <bits/stdc++.h>
using namespace std;

int main() {

  int a = 10, b = 5;

  cout << a << endl;
  cout << b << endl;
}
実行結果
10
5

上のプログラムは次のように書いた場合と同じ意味になります。

int a = 10;
int b = 5;

変数名のルール

変数名は基本的に自由につけることができますが、一部の名前を変数名にしようとするとコンパイルエラーになります。

利用できない変数名

以下の条件に該当する名前は変数名にできません。

  • 数字で始まる名前
  • _以外の記号が使われている名前
  • キーワード(C++が使っている一部の単語)

以下は変数名にできない名前の例です。

int 100hello; // 数字で始まる名前にはできない
int na+me; // 変数名に+を使うことはできない
int int; // intはキーワードなので変数名にできない

以下のような名前は変数名にできます。

int hello10; // 2文字目以降は数字にできる
int hello_world; // _ は変数名に使える

無意識にキーワードを変数名にしてしまうことはあまり無いので、キーワードに関してはあまり気にしなくても良いです。気になる人は「C++ キーワード」等でWebで検索してみてください。

同じ名前の変数は宣言できない

同じ名前の変数を複数宣言することはできません。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int a = 0;

  int a = 5; // この行でコンパイルエラーになる

  cout << a << endl;
}
コンパイルエラー
./Main.cpp: In function ‘int main()’:
./Main.cpp:7:9: error: redeclaration of ‘int a’
     int a = 5; // この行でコンパイルエラーになる
         ^
./Main.cpp:5:9: note: ‘int a’ previously declared here
     int a = 0;
         ^

error: redeclaration of ‘int a’(エラー: ‘int a’の再宣言)というエラーメッセージが表示されています。

例外的に同じ名前の変数を宣言する方法もありますが、それについては「1.08.変数のスコープ」で説明します。


int以外にもC++には様々な型があります。ここでは重要な3つの型だけを紹介します。

書き込むデータの種類
int 整数
double 小数(実数)
string 文字列
#include <bits/stdc++.h>
using namespace std;

int main() {
  int i = 10;
  double d = 0.5;
  string s = "Hello";

  cout << i << endl;
  cout << d << endl;
  cout << s << endl;
}
実行結果
10
0.5
Hello

異なる型同士の計算

異なる型同士の計算では型変換が行われます。
例えば、int型とdouble型の計算結果はdouble型になります。

ただし、変換できない型同士は計算はコンパイルエラーになります。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int i = 30;
  double d = 1.5;
  string s = "Hello";

  cout << i + d << endl; // 31.5
  cout << i * d << endl; // 45
  cout << 45 / 2 << endl; // 22 小数点以下切り捨て
  cout << i * d / 2 << endl; // 22.5 小数点以下も残る
  /*
  以下の処理はコンパイルエラー
  cout << s + i << endl; // string型とint型
  cout << s * i << endl; // string型とint型
  cout << s + d << endl; // string型とdouble型
  */
}
実行結果
31.5
45
22
22.5

計算の途中にdouble型のデータが入ってくるかどうかで、小数点以下を切り捨てるかどうかが変わってきます。
string型とint型、string型とdouble型は変換できない型の組み合わせなのでコンパイルエラーになります。

異なる型同士の代入

異なる型同士の代入でも型変換は行われます。
計算と同様、変換できない型同士の代入はコンパイルエラーになります。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int i = 10;
  double d = i; // doubleとintは互いに代入できる(小数点以下切り捨て)
  string s = "Hello";

  i = s; // int型とstring型は互いに代入できない

  cout << i << endl;
}
コンパイルエラー
./Main.cpp: In function ‘int main()’:
./Main.cpp:9:5: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘int’ in assignment
   i = s; // int型とstring型は互いに代入できない
     ^

「エラー:代入時に‘string’を‘int’に変換できません」というような内容のエラーメッセージが表示されています。

double型とint型は変換できる型同士なので互いに代入できます。double型をint型に変換したときは小数点以下切り捨てになります。
int型やdouble型の型変換については3.01.数値型で詳しく説明します。


細かい話

細かい話なので、飛ばして問題を解いても良いです。

初期化する前の変数の値

初期化する前のint型やdouble型の変数の値を読み込んだ場合、どのような値になっているか分かりません。

次のプログラムは初期化する前の変数の値を読み込む例です。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int name;
  cout << name << endl; //なにが出力されるかわからない
}

変数の初期化をし忘れてしまい、このプログラムのような状況になることがしばしばあります。
変数の初期化し忘れによるバグ(プログラムのミス)を防ぎたい場合、すべての変数を宣言時に適当な値で初期化しておくのも一つの手です。

より厳密には、初期化する前の変数の値は基本的に宣言するより前の処理内容で決まります。
その関係で、単純なプログラムでは初期化しなくても変数の値は0になっていることが多いです。

なお、string型の変数は初期化を行わなかった場合は自動的に""で初期化されます。


問題

リンク先の問題を解いてください。