为什么(x-(x/y)*y)的评估与x%y相同?

Vij*_*esh -4 c

#include <stdio.h>

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

为什么这段代码会打印出值x % y

从严格的数学角度来看,(x/y)*y是相同的x,所以如果以这种方式观察,人们可能会期望打印0.

dbu*_*ush 5

原因在于/操作员如何使用特定类型.

除法运算x/y作为整数除法执行,因为两个操作数都是整数类型.因此,结果值具有截断的小数部分.

因此,乘以该结果y将不一定x与截断结果值相同.这个结果和之间的区别xx%y.

根据C标准第6.5.5节:

6 当整数被划分时,/运算符的结果是代数商,丢弃任何小数部分. 如果商a/b是可表示的, 则表达式(a/b)*b + a%b 应相等a ; 否则,双方的行为a/ba%b 不确定.

因此标准明确规定这种平等成立.

如果除法的任一操作数是浮点类型,则x-(x/y)*y由于浮点运算的不精确性,它将始终为0或非常接近0的值.