3.2 int型変数
3.2.1 int型変数とは
まずはこのプログラムを見てほしい。
#include <iostream>
using namespace std;
int main() {
int x;
x = 4;
cout << "x: " << x << endl;
}このプログラムの出力は次のようになる。
x: 4変数とは、値を保存しておき、名前を使ってその値を扱うための仕組みである。このプログラムでは、5行目でint型の変数xを定義し、6行目で変数xに4を代入している。そのため、7行目でxの値を出力すると、4と出力されている。
変数にはどんな値でも自由に入れられるわけではない。この変数には整数が入る、文字列が入る、のようにどのような値が入るかを指定しなければいけない。これを「型」と呼ぶ。ここでは、整数を入れるために、int型にしている。
xは変数の名前である。変数の名前はプログラマーが自由に決めることができる。numberなど、1文字でなくても良い。ただし、変数名に使えるのは半角英数字と記号_のみである。また、変数名を数字から始めることはできない。
TIP
intはinteger(整数)の略。
coutに続けてxと書くと、変数xの中身が出力される。一方、"x"と書くと、「x」という文字列が出力される。""をつける意味がわかっただろうか。
先ほどの例では、変数の定義と代入を別々に行ったが、これらを同時に行うこともできる。以下のように書いても、プログラムの動作は変わらない。
#include <iostream>
using namespace std;
int main() {
int x = 4;
cout << "x: " << x << endl;
}DANGER
同じ名前の変数を2回定義する事はできない。
例えば、main関数の中で
int x = 4;
int x = 3;などと書くとコンパイルエラーとなる。(コンパイルについては2.1.2を思い出してほしい。)
変数の値を変えたい場合は、次のように記す。
int x = 4;
x = 3;本当に値が途中で変わっているか気になる場合は、1行目と2行目の間にcoutを挟んでxの値を確認してみると良いだろう。
int x = 4;
cout << x << endl;
x = 3;
cout << x << endl;DANGER
C++では、「型」が異なる値と変数について、一部の場合を除き、値をそのまま変数に代入することはできない。例えば、int型の変数に文字列(=string型とよばれている)を入れるような命令はエラーとなる。
int x = 4;
x = "hello!"; // int型変数に文字列を代入しようとしているので、コンパイルエラーとなる3.2.2 int型の計算
パソコンは計算機なので、当然計算ができる。
#include <iostream>
using namespace std;
int main() {
int x = 11;
int y = 7;
cout << x + y << endl;
cout << x - y << endl;
cout << x * y << endl;
cout << x / y << endl;
cout << x % y << endl;
}と書けば、
18
4
77
1
4と出力される。上から順に
- 和
+ - 差
- - 積
* - 商
/ - 剰余(mod)
%
である。+・-・*・/・%などの記号を演算子と呼ぶ。
ここで、int型同士の割り算について、結果はint型となる。(文字通り「商」を取る、すなわち小数点以下は切り捨てられる。)
小数の演算については第5章で扱う。
また、値を代入することもできる。
#include <iostream>
using namespace std;
int main() {
int x = 4;
int y = 7;
int f = x + y;
cout << f << endl;
f = x - y;
cout << f << endl;
}このプログラムを実行すると、次のように出力される。
11
-3数学のとは異なり、これは「右辺の値を左辺に代入する」操作を意味する。
計算の中でも特に、x = x + 4など、「加算」したい時は、x += 4と略記することができる。他にも -=, *=, /=, %=が使える。
TIP
代入演算子=は演算子の右辺を計算して、その結果を左辺の変数に代入する演算子である。 例えばx = x + 4という命令ではx + 4が計算され、その結果がxに代入される。
#include <iostream>
using namespace std;
int main() {
int x = 4;
x += 7;
cout << x << endl; // 11が出力される
}3.2.3 オーバーフロー
オタクというのはでかい数字が大好きなので、
int yen = 5000000000000000;
cout << yen << endl;と書きたくなるかもしれない。しかし、これを実行すると937459712が出力される。
これは、オーバーフローというものが起きるからである。int型が扱える数値には上限があって(同時に下限もある)、それを超える数を扱う事はできない。この、扱える範囲を超えた数値を扱おうとする時に発生する問題を「オーバーフロー」と呼ぶのである。
int型が扱える数の範囲は-2,147,483,648〜2,147,483,647である。基本的に気にすることはないが、計算結果が合わないという時には、オーバーフローを疑うと良いだろう。
ちなみに、上の例で出力される値が937459712となったのは、数値の最上位の桁をコンピューターが無視するために、上限値を超えた際、値が下限値に戻ったからである。
TIP
オーバーフローに関連して、ゲーム「パズル&ドラゴンズ」において2021年まで各キャラクターが出せる最大ダメージは2,147,483,647ダメージであったという話がある。これはゲームがint型を用いていたためについていた制限である。 なお、2021年のアップデートでダメージ上限が変更された。これはより大きい整数を扱える型(C++で言うところのlong long型)に変えられたからだそうだ。