C++ 除零后的余数

C++ 除零后的余数,c++,c,integer-division,C++,C,Integer Division,我知道数学中不允许用零除,但我可以用模乘零吗?我应该得到什么答案 比如说 10%0 = ? 5%0 = ? 结果是UB C11dr§6.5.5“/运算符的结果是第一个操作数除以第二个操作数所得的商;%运算符的结果是余数。在这两种运算中,如果第二个操作数的值为零,则行为未定义。”在C/C++中是,根据编译器的不同,甚至同一程序的不同实例,您可以得到不同的结果 二进制/运算符产生商,二进制%运算符产生商 将第一个表达式除以 第二如果/或%的第二个操作数为零,则行为为 未定义 从数学上讲,你应该得

我知道数学中不允许用零除,但我可以用模乘零吗?我应该得到什么答案

比如说

10%0 = ?
5%0 = ?
结果是UB

C11dr§6.5.5“/运算符的结果是第一个操作数除以第二个操作数所得的商;%运算符的结果是余数。在这两种运算中,如果第二个操作数的值为零,则行为未定义。”

在C/C++中是,根据编译器的不同,甚至同一程序的不同实例,您可以得到不同的结果

二进制/运算符产生商,二进制%运算符产生商 将第一个表达式除以 第二如果/或%的第二个操作数为零,则行为为 未定义


从数学上讲,你应该得到无穷大,这是正确的答案。。。在编程上,任何sane编译器都会警告您以零除法,因为在内部,模运算符(至少在C/C++中)是在除法中转换的(在大多数实现中)。因此,您的问题的答案是,在这两种情况下都会出现浮点异常。

标准将其定义为“未定义”

在几乎所有的处理器中,模运算的功能与除法相同。在现代大型处理器中,它是一条指令(例如x86)。通常,此指令在被零除时会导致陷阱,无论代码是“打算使用模”还是“商”部分,这都适用

它是未定义的,因此处理器和编译器可以自由地实现他们想要的-例如,如果处理器只是返回作为输入的内容,这也是允许的,或者如果它导致整个操作系统崩溃,根据标准,这也是“好的”

总之,零的模等于除以零


(请注意,通常情况下,浮点除以零不会捕获(默认情况下),并生成一个无穷大的值,除非除以的值也是零,在这种情况下,您会得到“不是一个数字”)

我只是好奇您为什么要这样做。。。(或者只是好奇…)你真的可以试着编译并测试。。。你认为答案是什么?你能想象这样的手术吗?我当然不能。@inixsoftwarewoundering@PawełStawarz,那只会告诉你那台机器上的编译器做什么。@vonbrand thinking是独立于机器的。哦,但你会知道,至少libc会像微软的实现一样引发浮点异常。标准的
try/catch
不适用于处理器异常(陷阱). 如果您使用Microsoft特定的“结构化异常处理”
\uuuu try
\uuu except
,它将起作用,但仅在Windows系统中使用。@jtimz,我不同意从数学上讲,x%0应该是无限的。你的推理是什么?@user207933很好,从数学上讲
x%0
应该是x。@jimz,如果
n=0
,那么
r=a-n*floor(a/n)
变成
r=a-0*floor(a/0)
。因为,当
n
接近
0
a/n
接近
inf
(或
-inf
,取决于
a
的符号),我们有
0*floor(inf)=0*inf
(假设
floor(inf)=inf
),这在数学上是没有定义的。如果我们稍微改变规则,忽略未定义的
0*inf
,忽略下限,我们可以减少
n
,得到
r=a-a=0
。顺便说一句,
fmod
的分母值非常小。因此,根据我的推理,<代码> x% 0 < /C>不应该完全地用数学定义。一般来说,记住任何数学表达式都没有意义,这就调用了C和C++中的未定义行为。因为在数学世界里你不能除以
0
,这里是你的UB。