C++标准(2003)在§5.6/4中说,
[...]如果/或%的第二个操作数为零,则行为未定义;[...]
也就是说,以下表达式调用未定义行为(UB):
X / 0; //UB
X % 0; //UB
还要注意,-5%2
并不等于-(5%2)
(正如Petar在对其答案的评论中所暗示的那样)。它是实现定义的。规范说(§5.6/4),
[...]如果两个操作数都是非负的,那么余数也是非负的;如果不是,余数的符号是实现定义的。
这个答案不适合数学家。这个答案试图给出动力(以数学精度为代价)。
数学家:看这里。
程序员:记住0
除法是undefined
。因此,依赖除法的mod
也是未定义
。
这表示正x
和d
的除法;它由整数部分和小数部分组成:
(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
)