| 演算子 | 操作 | 備考 |
| + | 加算 | |
| - | 減算、単項のマイナス記号 | |
| * | 乗算 (掛算) | |
| / | 除算 (割算) |
整数(int)型、float型、double型ともに使えるが、 int同士の除算は小数点以下は切捨てられる。(整数の割り算の商)。 |
| % | 剰余 (余り) |
ともにintの場合に余りを計算する。 例えば、「10÷3 = 商3 余り1」なので、10%3 は 1 と計算される。 |
| ++ | インクリメント | 1増やす。x++ や ++x として用いると、x = x+1 と同じ効果。 |
| -- | デクリメント | 1減らす。x-- や --x として用いると、x = x-1 と同じ効果。 |
int x=5; x++; // ++x; と書いても同じ cout << "xの値は" << x << "です\n" ; // 6と表示される1 減らす働きをもつ演算子デクリメント (--) についても同様である。
int x, s, t; x = 5; s = x++; // s = x; x = x + 1; の順で計算されるので s = 5 となる x = 5; t = ++x; // x = x + 1; t = x; の順で計算されるので t = 6 となる cout << "sの値は" << s << "です\n"; cout << "tの値は" << t << "です\n";
| 優先順位 | 演算子 | 結合性 |
| 1 | ++(後置)、--(後置) | 左 |
| 2 | ++(前置)、--(前置) | 左 |
| 3 | *、/、% | 左 |
| 4 | +、- | 左 |
int x=4; int y=10; int a; a = x+y/2; // 平均値を求めるための駄目な例 cout << "aの値は" << a << "です\n";もちろん、駄目な理由は、除算「/」が優先され、
と解釈されてしまうためである。
と解釈させるためには、int x=4; int y=10; int a; a = (x+y)/2; // 平均値を求めるための正しい例 cout << "aの値は" << a << "です\n";ただし、この用途で用いることができるのは小カッコ () のみで、 中カッコ {} や大カッコ [] は使えないので注意。
という式をプログラムでどう書いたら良いだろうか。int x=2; int y=5; int a; a = 10/x*y; // 誤り例 cout << "aの値は" << a << "です\n";計算式には除算「/」と乗算「*」が含まれるが、これらの優先順位は等しいので、左から順に実行されてしまい、
と解釈される。これは計算したかった式とは異なる。
int x=2; int y=5; int a; a = 10/(x*y); // 正しい例 cout << "aの値は" << a << "です\n";なお、「左から順に計算される」ことに注意すれば、以下のようにカッコなしで「a = 10/x/y;」とも書ける。
int x=2; int y=5; int a; a = 10/x/y; // 正しい例 cout << "aの値は" << a << "です\n";最初からこの書き方に馴染める学生は多くないと思うが、世の中には様々な記法をするプログラマがいるので、
| int型の数 |
・1, 2, 3 … などのように、小数点以下のない数
・int x; などのように、int型で宣言された変数に格納されている数 |
| double型の数 |
・1.0, 2.0, 3.0, 3.14 … などのように、小数点以下を含む数
・double x; などのように、double型で宣言された変数に格納されている数 |
| 計算式 | 計算結果についての補足 |
| 3 * 5 | (int型) * (int型) なので、結果もint型の 15 |
| 3.0 * 5.0 | (double型) * (double型) なので、結果もdouble型の 15.0 |
| 計算式 | 計算結果についての補足 |
| 3 * 5.0 |
(int型) * (double型) だが、int型の3がdouble型の3.0に型変換され、 3.0 * 5.0 が計算される。結果はdouble型の 15.0 |
| 3.0 * 5 |
(double型) * (int型) だが、int型の5がdouble型の5.0に型変換され、 3.0 * 5.0 が計算される。結果はdouble型の 15.0 |
| 計算式 | 計算結果についての補足 |
| 3 / 5 | (int型) / (int型) なので、計算結果は割り算の商であるint型の 0 |
| 3.0 / 5.0 | (double型) / (double型) なので、小数点以下を含む割り算が行われる。結果はdouble型の 0.6 |
| 3 / 5.0 |
(int型) / (double型) だが、int型の3がdouble型の3.0に型変換され、 3.0 / 5.0 が計算される。結果はdouble型の 0.6 |
| 3.0 / 5 |
(double型) / (int型) だが、int型の5がdouble型の5.0に型変換され、 3.0 / 5.0 が計算される。結果はdouble型の 0.6 |
double x = 3;ここでは、double型の変数にint型の 3 を格納している。
int x = 3.14; // 何が起こる?このとき、double型の数である 3.14 はint型に型変換される。C/C++では、double型をint型に型変換すると、小数点以下の数値は切り捨てられる。
int x = 3.14; // 3.14 を整数に型変換された 3 が x に代入される cout << "x は" << x << "\n"; // x は3 // 他の例も提示 x = -3.14; // x = -3 に丸められる cout << "x は" << x << "\n"; // x は-3 double y = 10.2; x = y; // x = 10 に丸められる cout << "x は" << x << "\n"; // x は10なお、このようにdouble型をint型に型変換するということは、実際には意図せず行ってしまうことが多い。
Main.cpp:4:9: warning: implicit conversion from 'double' to 'int' changes value from 3.14 to 3 [-Wliteral-conversion]
int x = 3.14; // 3.14 を整数に型変換された 3 が x に代入される
~ ^~~~
Main.cpp:10:5: warning: implicit conversion from 'double' to 'int' changes value from -3.14 to -3 [-Wliteral-conversion]
x = -3.14; // x = -3 に丸められる
~ ^~~~~
2 warnings generated.
「implicit conversion from 'double' to 'int' changes value from 3.14 to 3」はint x = (int)3.14; // 3.14 を整数に型変換された 3 が x に代入される cout << "x は" << x << "\n"; // x は3 // 他の例も提示 x = (int)-3.14; // x = -3 に丸められる cout << "x は" << x << "\n"; // x は-3これは、「わかっていて意図的にやってるんですよ」ということをコンパイラに指示していることになり、警告は消える。
x = (何らかの計算);何度か述べたように、上記の計算は下記の流れで行われる。
double x; x = 1 / 5; cout << "xは" << x << "である\n";x は 0 と表示されるが、それは下記の計算ステップが行われたことによる
int s, t; double x; s = 1; t = 5; x = s / t; cout << "xは" << x << "である\n";こちらも x は 0 と表示されるが、それは下記の計算ステップが行われたことによる。
int x; x = 1.0 / 5.0; cout << "xは" << x << "である\n";1.0 と 5.0 はどちらも double型なので、xには 0.2 が格納されるように見えるが、 やはり x には 0 が格納される。