例: これらの式の値は何ですか? それらはコンパイラに依存していますか?
-7/3 -7%3
7/-3 7%-3
-7/-3 -7%-3
C89 では、/
負のオペランドの場合、除算の結果はどちらの方法でも切り捨てることができます。
C99 以降では、結果はゼロに向かって切り捨てられます。
演算子は、すべての標準での%
動作に依存します。/
参考文献:
C89§3.3.5
いずれかのオペランドが負の場合、演算子の結果が
/
代数商以下の最大の整数であるか、代数商以上の最小の整数であるかは実装定義です。%
オペレーター。商a/b
が表現可能である場合。式(a/b) * b + a%b
は等しいものとしa
ます。
と
C11 § 6.5.5
整数が除算されると、
/
演算子の結果は小数部分が破棄された代数商になります。
脚注付き:
これはしばしば「ゼロへの切り捨て」と呼ばれます。
結果は、コンパイラが準拠している言語仕様によって異なります。演算子/
と%
は次の関係で結ばれています
(a / b) * b + (a % b) == a
標準 C89/90 は、除算の結果は実装定義であると述べています。コンパイラは、ユークリッド除算 (負の無限大方向への切り捨て、負でない剰余)、または Fortran スタイルの除算 (ゼロ方向への切り捨て、場合によっては負の剰余) のいずれかを実装できます。 )。
ユークリッド除算で
-7/3 = -3 -7%3 = 2
7/-3 = -2 7%-3 = 1
-7/-3 = 3 -7%-3 = 2
Fortran 形式の除算
-7/3 = -2 -7%3 = -1
7/-3 = -2 7%-3 = 1
-7/-3 = 2 -7%-3 = -1
標準 C99 (およびそれ以降) では、すべての C コンパイラが Fortran スタイルの除算を実装する必要があります。
補足: C++ は、C++03 までずっと実装定義の仕様に固執しています。ただし、C++11 では Fortran スタイルの除算が義務付けられています。
% は / に依存するため (これらは実際には同じ演算です。/ は商を返し、% は剰余を返します)、得られるものは提供されたオペランドに基づいています。C は代数の規則に従うため、次のことが当てはまります。