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

时间:2017-01-26 14:39:19

标签: c

#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/y)*yx相同,因此如果以这种方式查看,可能会打印0。

1 个答案:

答案 0 :(得分:5)

原因必须是/运算符如何处理特定类型。

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

由于截断结果值,因此将此结果乘以y因此不一定与x相同。此结果与x之间的差异为x%y

来自C standard的第6.5.5节:

  

6 当整数被分割时,/运算符的结果是   任何小数部分丢弃的代数商。如果   商a/b可表示,表达式(a/b)*b + a%b   应等于a ;否则,a/ba%b的行为   未定义。

因此标准明确规定此等式成立。

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