可能重复:
返回值 1.#INF000
我一直认为除以 0 会导致编译的程序崩溃
但是我今天发现(使用 VC++ 2010 Express)除以 0 会得到一个叫做 1.#INF000 的东西,它应该是正无穷大
当它被传递给一个函数时,它被传递为 -1.#IND000
这是怎么回事?
在谷歌上搜索 1.#INF000 和 -1.#IND000 也没有提供任何明确的解释
它只是特定于 VC++ 的东西吗?
可能重复:
返回值 1.#INF000
我一直认为除以 0 会导致编译的程序崩溃
但是我今天发现(使用 VC++ 2010 Express)除以 0 会得到一个叫做 1.#INF000 的东西,它应该是正无穷大
当它被传递给一个函数时,它被传递为 -1.#IND000
这是怎么回事?
在谷歌上搜索 1.#INF000 和 -1.#IND000 也没有提供任何明确的解释
它只是特定于 VC++ 的东西吗?
浮点除以零的行为不同于整数除以零。
IEEE 浮点标准区分 +inf 和 -inf,而整数不能存储无穷大。整数除以零会导致未定义的行为。浮点除以零由浮点标准定义,结果为 +inf 或 -inf。
编辑:
正如 Luchian 所指出的,C++ 实现不需要遵循 IEEE 浮点标准。如果您使用的实现不遵循 IEEE 浮点标准,则浮点除以零的结果是未定义的。
编辑:问题是关于 C++ 并且 C++ 中的结果是未定义的,正如标准所明确指出的那样,而不是 IEEE 或任何其他实际上不规范 C++ 语言的实体。标准可以。C++ 实现可能遵循 IEEE 规则,但在这种情况下,很明显行为是未定义的。
我一直认为除以 0 会导致编译的程序崩溃
不,它会导致未定义的行为。任何事情都可能发生,不能保证崩溃。
根据 C++ 标准:
4) 二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义;否则 (a/b)*b + a%b 等于 a。如果两个操作数都是非负数,则余数是非负数;如果不是,则余数的符号是实现定义的79)。(强调我的)
您可以在 C 中使用以下代码片段。它会引发异常。它适用于关于 windows 的 linux donno
#include <fenv.h>
#include <TRandom.h>
static void __attribute__ ((constructor)) trapfpe(void)
{
/* Enable some exceptions. At startup all exceptions are masked. */
feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
}