#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)*y
与x
相同,因此如果以这种方式查看,可能会打印0。
答案 0 :(得分:5)
原因必须是/
运算符如何处理特定类型。
除法操作x/y
作为整数除法执行,因为两个操作数都是整数类型。因此,结果值将截断的小数部分截断。
由于截断结果值,因此将此结果乘以y
因此不一定与x
相同。此结果与x
之间的差异为x%y
。
来自C standard的第6.5.5节:
6 当整数被分割时,
/
运算符的结果是 任何小数部分丢弃的代数商。如果 商a/b
可表示,表达式(a/b)*b + a%b
应等于a
;否则,a/b
和a%b
的行为 未定义。
因此标准明确规定此等式成立。
如果除法的任一操作数是浮点类型,则由于浮点运算的不精确性,x-(x/y)*y
将始终为0或非常接近0的值。