C++ の除算
この記事は、C++ の除算規則に関するものです。
最初に、除算の優先順位と型キャスト規則を調べます。 後で、カットオフ キャストとして知られる一般的な整数除算の特性について説明します。
C++ の優先順位と結合規則
優先順位という用語は、式内の演算子の評価順序を指定します。 たとえば、最高レベルから最低レベルまでの C++ 演算子の優先順位規則の一部は次のとおりです。
- 括弧内に記述された式が最初に評価されます。
- 演算子
*
と\
の優先順位は同じです。 - 同様に、演算子
+
と-
の優先順位は同じです。 - 式の中で同じ優先レベルの 2つの演算子が発生した場合、演算子は左から右に評価されます (代入演算子 (
=
を除く)。これは、演算子の結合性とも呼ばれます。
たとえば、次の混合式を考えてみましょう。
(1*2)+3/3*2-1
上記の式は、次のように評価されます。
-
最初のパスでは、
*
演算子が最初に評価されます。これは、優先順位が最も高い括弧で囲まれているためです。 最初のパスの後、式は2+3/3*2-1
のようになります。 -
/
演算子は、最初に 2 番目のパスで評価されます。 演算子*
と/
の優先順位は同じですが、優先順位が等しい演算子は左から右に評価されます。2 回目のパスの後、式は
2+1*2-1
のようになります。 -
3 番目のパスでは、式内の他の演算子の中で最も優先度が高い乗算演算子が評価されます。 3 回目のパスの後、式は
2+2-1
に縮小されます。 -
+
演算子は、4 番目のパスで最初に評価されます。 演算子+
と-
の優先順位は同じですが、優先順位が等しい演算子は左から右に評価されます。4 回目のパスの後、式は
4-1
になります。 -
最後に、
-
演算子が評価され、式が単一の値3
に縮小されます。
これで、演算子の優先順位と結合規則について十分な背景知識が得られました。 C++ の /
演算子の特殊性をいくつか調べてみましょう。
C++ における整数除算の特異性
C++ で 2つの整数を除算すると、除算演算子は答えの整数部分のみを返します。 答えの小数部分は切り捨てです。
主な理由は、コンパイラによる暗黙的な型キャストです。 型キャストに飛び込む前に、整数除算の例を見てみましょう。
#include <iostream>
using namespace std;
int main() {
int m = 10;
int n = 7;
float a = m / n;
cout << "The answer after division is:" << a << endl;
}
出力:
The answer after division is:1
出力は、C++ コンパイラが回答の小数部分をスキップすることを確認します。 この特異性の根本原因と考えられる解決策を理解するために、まず型キャストを理解しましょう。
C++ の整数除算の特殊性を型キャストして解決する
型キャストとは、変数の型を変更することです。 型キャストは、暗黙的または明示的のいずれかです。
明示的な型キャスト
これは、プログラマによって明示的に実行されます。 キーワード static_cast
は、明示的な型キャストに使用されます。
このタイプのキャストは、コンパイル時に行われます。
次のコードは、明示的な型キャストを使用して整数除算の問題を解決します。 以下のコードの 6 行目は、m
と n
の値を静的に浮動小数点値にキャストします。 したがって、除算の結果も浮動小数点数になります。
#include <iostream>
using namespace std;
int main() {
int m = 10;
int n = 7;
float a =
static_cast<float>(m) / static_cast<float>(n); // static explicit casting
cout << "The answer after explicit typecasting is: " << a << endl;
}
出力:
The answer after explicit typecasting is: 1.42857
暗黙の型キャスト
暗黙的な型キャストは、コンパイラによって自動的に実行されます。 コンパイラは、式で使用されるデータ型に従って式を評価します。
コンパイラは常に、指定された式で使用されているすべてのデータ型の中で、上位のデータ型で結果を評価します。
暗黙的なキャストは、整数除算の特殊性の根本的な原因です。 算術除算で 2つの整数オペランドを使用すると、評価が暗黙的に int データ型に変換され、結果の小数部分が切り捨てられます。
以下のコードに示すように、1つの除算オペランドの型を浮動小数点型に変更することで、整数除算の問題を解決できます。
#include <iostream>
using namespace std;
int main() {
float a = 10.0 / 7;
cout << "The answer after implicit typecasting is: " << a << endl;
}
出力:
The answer after implicit typecasting is: 1.42857
上記の例では、分子 10.0
は float 値で、分母は整数値です。 float データ型は integer データ型より上位であるため、コンパイラは暗黙的に結果の値を float データ型に変換します。
ゼロ エラーによる除算 や ポインターの除算 など、C++ の除算演算子に関連する特殊性が他にもいくつかあります。