为什么 ideone.com 这样做?
Why ideone.com does this?
我最近试图 运行 此代码 ideone.com...
#include <iostream>
#include <string>
using namespace std;
int getVal(string name)
{
if (name == "Devashish") return 0;
return 1;
}
int main()
{
cout << 5 / getVal("Devashish");
return 0;
}
有趣的是,这段代码没有抛出任何异常并在输出中打印了 5。代码是有意编写的以产生异常。这是成功编译和执行错误代码的想法 link:http://ideone.com/ogDzDU
当我试图在 Visual Studio 上执行相同的代码时,我得到了一个异常(这是预期的)。只是好奇。为什么ideone会这样?这是他们的编译器或其他程序中的错误吗?
在 C++ 程序中除以零具有严格未定义的行为。
这意味着没有人能说出您的程序将如何运行。它可能 引发异常,但不能保证一定会。它也可以 运行 顺利地让你感到困惑,就像你现在一样。
这就是 UB 的本质。你绝对不应该在你的代码中有 UB,因为只有这样你才能推理它。但是通过未定义行为,C++ 标准为实现提供了巨大的优化机会。当我们作为程序员犯错时,他们不需要不断地添加引发异常的检查。
我最近试图 运行 此代码 ideone.com...
#include <iostream>
#include <string>
using namespace std;
int getVal(string name)
{
if (name == "Devashish") return 0;
return 1;
}
int main()
{
cout << 5 / getVal("Devashish");
return 0;
}
有趣的是,这段代码没有抛出任何异常并在输出中打印了 5。代码是有意编写的以产生异常。这是成功编译和执行错误代码的想法 link:http://ideone.com/ogDzDU
当我试图在 Visual Studio 上执行相同的代码时,我得到了一个异常(这是预期的)。只是好奇。为什么ideone会这样?这是他们的编译器或其他程序中的错误吗?
在 C++ 程序中除以零具有严格未定义的行为。
这意味着没有人能说出您的程序将如何运行。它可能 引发异常,但不能保证一定会。它也可以 运行 顺利地让你感到困惑,就像你现在一样。
这就是 UB 的本质。你绝对不应该在你的代码中有 UB,因为只有这样你才能推理它。但是通过未定义行为,C++ 标准为实现提供了巨大的优化机会。当我们作为程序员犯错时,他们不需要不断地添加引发异常的检查。