4

例: これらの式の値は何ですか? それらはコンパイラに依存していますか?

-7/3   -7%3
7/-3   7%-3
-7/-3  -7%-3
4

3 に答える 3

6

C89 では、/負のオペランドの場合、除算の結果はどちらの方法でも切り捨てることができます。

C99 以降では、結果はゼロに向かって切り捨てられます。

演算子は、すべての標準での%動作に依存します。/


参考文献:

C89§3.3.5

いずれかのオペランドが負の場合、演算子の結果が/代数商以下の最大の整数であるか、代数商以上の最小の整数であるかは実装定義です。%オペレーター。商a/bが表現可能である場合。式(a/b) * b + a%bは等しいものとしaます。

C11 § 6.5.5

整数が除算されると、/演算子の結果は小数部分が破棄された代数商になります。

脚注付き:

これはしばしば「ゼロへの切り捨て」と呼ばれます。

于 2015-05-15T08:52:31.570 に答える
0

結果は、コンパイラが準拠している言語仕様によって異なります。演算子/%は次の関係で結ばれています

(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 スタイルの除算が義務付けられています。

于 2015-05-15T15:55:14.150 に答える
0

% は / に依存するため (これらは実際には同じ演算です。/ は商を返し、% は剰余を返します)、得られるものは提供されたオペランドに基づいています。C は代数の規則に従うため、次のことが当てはまります。

  • 演算の順序は PEMDAS に従います: 括弧、指数、乗算/除算、加算/減算。
  • 乗算/除算の場合、2 つの正または負の数は正の数になります。1 つの正の数と 1 つの負の数は負の結果になります。
于 2015-05-15T15:51:36.513 に答える