2017-08-09 110 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