考慮如下C / C ++程序並嘗試猜想輸出什麼?程序員
舉例一:編程
舉例二:數組
舉例三:安全
舉例四:微信
舉例五:性能
舉例六:學習
舉例七:優化
以上全部程序的輸出都是不可預測的(或不肯定的)。編譯器(實現C / C ++標準)能夠自由地作任何事情,由於C和C ++標準未定義它們。spa
像Java這樣的語言會當即發現錯誤,可是在少數狀況下,像C和C ++這樣的語言會繼續以靜默但有錯誤的方式執行代碼,這可能會致使沒法預測的結果。該程序可能會因任何類型的錯誤消息而崩潰,也可能在不知不覺中損壞數據的狀況,這是一個嚴重的問題。3d
瞭解未定義行爲的重要性
若是用戶開始在C / C ++環境中學習而且對未定義行爲的概念不清楚,那麼未來可能會帶來不少問題,例如在調試其餘人的代碼時可能實際上很難跟蹤根目錄。未定義的錯誤。
未定義行爲
的風險和缺點程序員有時依賴未定義行爲的特定實現(或編譯器),這可能會在更改/升級編譯器時引發問題。例如,最後一個程序在大多數編譯器中產生72做爲輸出,可是基於此假設實現軟件不是一個好主意。
未定義的行爲也可能致使安全漏洞,特別是因爲未檢查數組越界的狀況(致使緩衝區溢出攻擊)。
未定義行爲的優勢
C和C ++具備未定義行爲,由於它容許編譯器避免進行大量檢查。假設一組具備較高性能數組的代碼無需關注邊界,這避免了須要複雜的優化過程來檢查循環外的此類條件。當緊密綁定循環得到C編譯器一般提供的帶符號溢出的未定義性質的優勢時,會將程序從30%加快到50%的速度。
咱們還有另外一個優勢,由於它容許咱們將變量的值存儲在處理器寄存器中,並在大於源代碼中變量的時間內進行操做。它還有助於進行環繞檢查,而後進行編譯時檢查,若是不更瞭解C / C ++編譯器中的未定義行爲,就沒法進行檢查。
但願對你有幫助~
另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這裏或許能夠幫到你~
C語言C++編程學習交流圈子,QQ羣1090842465【點擊進入】微信公衆號:C語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習書籍分享:
編程學習視頻分享: