提问者:小点点

不能调零吗?


为什么x%0是无效表达式?

我一直认为X%0应该等于X.既然你不能除以零,那么答案不应该自然地是余数,X(剩下的所有东西)吗?


共3个答案

匿名用户

C++标准(2003)在§5.6/4中说,

[...]如果/或%的第二个操作数为零,则行为未定义;[...]

也就是说,以下表达式调用未定义行为(UB):

X / 0; //UB
X % 0; //UB

还要注意,-5%2并不等于-(5%2)(正如Petar在对其答案的评论中所暗示的那样)。它是实现定义的。规范说(§5.6/4),

[...]如果两个操作数都是非负的,那么余数也是非负的;如果不是,余数的符号是实现定义的。

匿名用户

这个答案不适合数学家。这个答案试图给出动力(以数学精度为代价)。

数学家:看这里。

程序员:记住0除法是undefined。因此,依赖除法的mod也是未定义

这表示正xd的除法;它由整数部分和小数部分组成:

(X / D) =   integer    +  fraction
        = floor(X / D) + (X % D) / D

重新安排,你会得到:

(X % D) = D * (X / D) - D * floor(X / D)

0替换D:

(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)

由于0除法是未定义:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined

匿名用户

x%d根据定义是一个数字0<=R<;d,使得存在q使得

X = D*Q + R

因此,如果d=0,则不可能存在这样的数字(因为0<=R<0)