如何表达"(a / b)* b + a%b - a"对于非零' c,总是为零

时间:2014-09-21 14:55:43

标签: c type-conversion expression division modulo

以下是Mike Banahan& C的C书的摘录。布拉迪(Link: Section 2.8.2.1)。像我这样的誓言没有理由怀疑作者是错的,除非你的人建议不这样做。

请告诉我地球上的"(a / b)* b + a%b - a" 对于b不为零的整数始终为零。

提取的文字如下:

  

如果任一操作数为负数,则/的结果可能是最接近的   整数到两侧的真实结果,以及结果的符号   %可能是正面的或负面的。这两个功能都是   实施定义。

     

下面的表达式总是等于零:

    (a/b)*b + a%b - a
     

除非b为零。

     

通常的算术转换应用于两个操作数。

3 个答案:

答案 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

num1anum2b, a/b为商部分,余数部分为a%b

所以a=(a/b)*b+(a%b)(a / b)* b +(a%b)-a 等于 0