以下是Mike Banahan& C的C书的摘录。布拉迪(Link: Section 2.8.2.1)。像我这样的誓言没有理由怀疑作者是错的,除非你的人建议不这样做。
请告诉我地球上的"(a / b)* b + a%b - a" 对于b不为零的整数始终为零。
提取的文字如下:
如果任一操作数为负数,则/的结果可能是最接近的 整数到两侧的真实结果,以及结果的符号 %可能是正面的或负面的。这两个功能都是 实施定义。
下面的表达式总是等于零:
(a/b)*b + a%b - a
除非b为零。
通常的算术转换应用于两个操作数。
答案 0 :(得分:4)
通过定义C中的%
运算符确实如此。
C标准中余数运算符的定义表示:
(C11,6.5.5p6)"如果商a / b可表示,则表达式(a / b)* b + a%b应等于a;"
另请注意,对于/
和%
,如果第二个操作数为0
,则标准指定操作为未定义的行为。
答案 1 :(得分:4)
...数学
在纸面上,(a / b)* b == a(b取消),这就是为什么结果看起来很有趣。
但是,计算机首先计算(a / b),然后乘以b。如果这是在整数运算中完成的,则a / b可能在乘法之前向下舍入。
如果< b,那么a / b的结果是0,而a%b是a,给出0 + a - a == 0
如果a> b,然后(a / b)* b == floor(a / b)和(a / b)* b + a%b == a,再次给出0。
本质上,这是对编译器是否正确执行整数运算的测试
答案 2 :(得分:2)
如果num1 / num2给出商q和余数r,
然后num1 = q*num2 + r
以num1
为a
而num2
为b,
,a/b
为商部分,余数部分为a%b
。
所以a=(a/b)*b+(a%b)
和(a / b)* b +(a%b)-a 等于 0