Mod Zero不能?

Das*_*aru 56 c++ modulo divide-by-zero

为什么X % 0表达无效?

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

Naw*_*waz 40

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

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

也就是说,以下表达式调用undefined-behavior(UB):

X / 0; //UB
X % 0; //UB
Run Code Online (Sandbox Code Playgroud)

请注意,这-5 % 2不等于-(5 % 2)(正如佩塔尔在他对他的回答的评论中所暗示的那样).它是实现定义的.规范说(§5.6/ 4),

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


Mat*_*haq 11

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

数学家: 见这里.

程序员:请记住,除以0undefined.因此,mod依赖于分裂的也是undefined.


这表示用于正分裂XD; 它由不可分割的部分和小数部分组成:

(X / D) =   integer    +  fraction
        = floor(X / D) + (X % D) / D
Run Code Online (Sandbox Code Playgroud)

重新排列,你得到:

(X % D) = D * (X / D) - D * floor(X / D)
Run Code Online (Sandbox Code Playgroud)

替换0D:

(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
Run Code Online (Sandbox Code Playgroud)

由于分裂0undefined:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined
Run Code Online (Sandbox Code Playgroud)


Pet*_*nov 5

X % D根据定义是一个数0 <= R < D,使得存在Q使得

X = D*Q + R
Run Code Online (Sandbox Code Playgroud)

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

  • 那不是真的,AFAIK,如果`x &lt; 0`,`x % y` 的符号是实现定义的。`-5 % 2` 在我的系统上恰好是 -1。 (2认同)
  • @Petar:不。`-5 % 2` 实际上不是`-(5 % 2)`。它是实现定义的。规范说,*如果两个操作数都是非负的,则余数是非负的;**如果不是,余数的符号是​​实现定义的*** (2认同)