0

C の % 演算子に問題があります。% 演算子が除算の余りを返すことはわかっています。しかし、1 % 2やのような質問に直面すると3 % 2、私は混乱します。これをグーグルで調べた後、さまざまな解決策を見つけました。

1 / 2そのまま を 0 に切り捨てると言う人もいます0.5。0 もそう1 % 2です。

他の人1 / 20.5、そのままではなく、数学のように 1 に切り上げます。1 もそう1 % 2です。

したがって、私は今混乱しています。私の質問は: 1 % 2 とは何ですか?

前もって感謝します :):)

4

5 に答える 5

2

M % D を考える簡単な方法 (M と D の両方が正の場合) は次のとおりです。

While ( M >= D){
    M = M-D;
}
return M;
于 2013-08-28T14:46:31.067 に答える
0

ここでは剰余の数学的定義が必要です。

2 つの整数m、dが与えられた場合、 rが 2 つの条件を満たす 場合、rはmdの除算の剰余であると言います。

  • となる別の整数kが存在しますm == k * d + r
  • 0 <= r < d.

Cでは、上記の定義に従うだけでm % d == rとが得られます。 ご覧のとおり、切り捨てはまったくありません (つまり、「切り捨て」は定義の結果です)。 m / d == k

定義から、3 % 2 == 1 および 3 / 2 == 1 が得られます。
その他の例:

4 / 3 == 1 および 5 / 3 == 1 ですが、5.0/3.0 == 1.6666 にもかかわらず (これは 2.0 に丸められます)。

4 % 3 == 1 および 5 % 3 == 2.

r = m - k * dC では次のように書かれて いる式も信頼できます。

m % d == m - (m / d) * d

ただし、標準 C では、整数除算は次の規則に従いますround to 0
したがって、負のオペランドでは、C は数学的なものとは異なる結果を提供します。
次のようになります。

(-4) / 3 == -1, (-4) % 3 == -1 (C では) ですが、普通の数学では (-4) / 3 = -2, (-4) % 3 = 2.

普通の数学では、剰余は常に非負であり、abs(d).
標準 C では、剰余は常に最初の演算子の符号を持ちます。

注: この説明 (負の場合) は、標準の C99/C11 のみを対象としています。コンパイラのバージョンに注意し、いくつかのテストを行う必要があります。

于 2013-08-28T23:06:09.557 に答える