D - 1.03.四則演算と優先順位 Editorial /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

演算子 計算内容
+ 足し算
- 引き算
* 掛け算
/ 割り算
% 割った余り
  • 整数同士の割り算は小数点以下切り捨て

四則演算

C++プログラムで簡単な計算をする方法を見ていきましょう。

次のプログラムは上から順に、「足し算」「引き算」「掛け算」「割り算」を行っています。

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

int main() {
  cout << 1 + 1 << endl; // 2
  cout << 3 - 4 << endl; // -1
  cout << 2 * 3 << endl; // 6
  cout << 7 / 3 << endl; // 2
}
実行結果
2
-1
6
2

これらの記号+, -, *, /のことを算術演算子といいます。

3 - 4-1になっている通り、負の値も計算できます。
*が「掛け算」で、/が「割り算」です。

7 / 32になっていることに注意して下さい。C++では、整数同士で割り算した場合、結果は小数点以下を切り捨てした値になります。(7 ÷ 3 = 2.33... → 2, -7 ÷ 3 = -2.33... → -2
小数点以下を切り捨てないで計算してほしい場合、7.0 / 3.0のように.0をつけます。同様に7.0 / 3.5のような計算も行えます。

剰余演算

もう一つ重要な算術演算子として % があります。この演算子は「割ったときの余り」を計算します。

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

int main() {
  cout << 7 % 3 << endl; // 1
  cout << 4 % 5 << endl; // 4
}
実行結果
1
4

7 ÷ 3 = 2 あまり 1
4 ÷ 5 = 0 あまり 4
となるため、このプログラムの出力は14になります。

演算子の優先順位

演算子には優先順位があります。

例えば1 + 2 * 3のような式を計算する場合、先に2 * 3が計算された後、1が足され、計算結果は7になります。
1 + 2 * 3 → 1 + 6 → 7
*+よりも優先順位が高いというわけです。

C++の算術演算子の優先順位は、一般的な数学の優先順位と同じです。%*/と同じ優先順位になります。

優先順位 高い 低い
演算子 *
/
%
+
-

( )を使って優先順位を変えることもできます。

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

int main() {
  cout << (1 + 2) * 3 << endl; // 9
}
実行結果
9

( )の中が先に計算され、(1 + 2) * 33 * 3となり結果は9になります。

なお、5 / 2 * 3のように同じ優先順位の演算子が並んでいる式は、基本的に左の演算子から順に計算されます。


注意点

除算の順序

割り算/のある整数同士の計算では、切り捨てが行われるタイミングの違いで結果が異なることがあります。

例えば3÷2×4を計算する場合、書き方によって2つの計算結果が考えられます。

  • 3 / 2 * 41 * 44
  • 3 * 4 / 212 / 26

多くの場合、割り算はできるだけ後の方で行うようにしたほうが正しい結果になります。

ゼロ除算

0で割ると実行時エラーが発生します。

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

int main() {
  cout << 3 / 0 << endl;
}
終了コード
136

3 % 0のように0で剰余演算%をした場合も同様に実行時エラーになります。

コードテスト上で表示される終了コードは136になります。
コードテスト以外の環境で実行した場合、Floating point exceptionと表示されることもあります。

なお、0 / 30 % 3のように、割られる数が0の場合は問題なく計算できることに注意してください。どちらも結果は0になります。


細かい話

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

負の数の剰余

剰余演算A % Bを行う時にAまたはBが負の数の場合、計算結果は以下のようになります。|A|, |B|はそれぞれの絶対値を表すとします。

  • Aが正のとき:|A|%|B|
  • Aが負のとき:-(|A|%|B|)

つまりBの正負に関わらず、計算結果はAの正負と一致します。

より正確に言うと、C++の剰余演算子は(A / B) * B + (A % B)Aが等しくなるように定義されており、結果的にAの正負と一致します。

問題

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