2017-08-09 108 views
0

我最近尝试运行在ideone.com ...为什么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。该代码被有意写入以产生异常。这里是ideone链接成功编译和执行bug的代码:http://ideone.com/ogDzDU

当我试图在Visual Studio上执行相同的代码时,我得到一个异常(这是预期的)。只是好奇。为什么ideone表现如此?这是编译器或其他程序中的错误吗?

+0

https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633 –

+0

Visual Studio和一个更多的在线工具提供了异常,所以我认为它会引发异常。即使不是这样,ideone是否给出了预期的? –

+0

*“ideone给予什么'期望?”*未定义的行为是未定义的,因此任何结果都可以称为“按预期”。 –

回答

5

在C++程序中除以零有严格未定义的行为。

这意味着没有人可以说你的程序将如何表现。它可能引发异常,但不能保证它会。它也可以顺利运行,让你感到困惑,就像你现在一样。

这就是UB的本质。你绝对不应该在你的代码中使用UB,因为只有这样你才能对它进行推理。但是通过保持行为未定义,C++标准为实现提供了极好的优化机会。当我们作为程序员失误时,他们不需要不断添加检查来引发异常。

+0

我不得不阅读这一句话两次,试图让它更少误解。虽然,这里没有母语... – user463035818

+0

@ tobi303 - 如果有帮助,当然。我认为从语言的角度来看这绝不是必要的,但我也不是母语的人。 – StoryTeller