2017-01-26 32 views
-4
#include <stdio.h> 

int main() { 
    int x = 9; 
    int y = 2; 
    int z = x - (x/y) * y; 
    printf("%d", z); 
    return 0; 
} 

なぜこのコードはx % yの値を出力しますか?(x-(x/y)* y)がx%yと同じに評価されるのはなぜですか?

厳密に数学的な観点から、(x/y)*yxと同じであるため、このように見た場合、0が印刷されることがあります。

+13

数学はなぜ機能するのか尋ねていますか? – tkausl

+1

小学校から数学の先生に相談してください。 – Olaf

+2

'x-(x/y)* y'は' x%y'の数学的実装です。 – haccks

答えて

5

理由は、/オペレータが特定のタイプでどのように動作するかに起因しています。

除算演算x/yは、両方のオペランドが整数型であるため、整数除算として実行されます。結果の値には、除算の小数部分が切り捨てられます。

この結果にyを掛け合わせると、結果値が切り捨てられるため、必ずしもxと同じではありません。この結果とxの違いはx%yです。 C standardのセクション6.5.5から

整数が分割されている場合、/オペレータの結果は破棄任意の小数部分と 代数商です。 商a/bが表現可能である場合発現(a/b)*b + a%baに等しくなければなりません。そうでなければ、a/ba%b の両方の動作は未定義です。

標準では、この等価性が保持されていると明示的に述べています。

除算のいずれかのオペランドが浮動小数点型の場合、x-(x/y)*yは浮動小数点演算の性質が不正確なため常に0または非常に0に近い値になります。

+0

その式が実際に '%'の動作がどのように定義されているかのように、私は標準から引用符を追加しています。しかし、それとは別に、この答えは実際にそれが持っている下降音に値しません。それは質問に正確に答えます。 – user694733

+0

@ user694733良いアイデア。編集されました。 – dbush

関連する問題