C語言基礎
關於C語言標準所說的未定義行為,下列說明何者正確?
- A標準沒有作任何規定的行為,編譯器可以假設它不會發生來進行最佳化,也可能出現意料之外的結果
- B由各處理系統決定結果,並且有義務把結果寫在文件中的行為
- C在執行時一定會被偵測,顯示錯誤訊息並停止程式的行為
查看答案與解析
正確答案:A. 標準沒有作任何規定的行為,編譯器可以假設它不會發生來進行最佳化,也可能出現意料之外的結果
未定義行為是標準不作任何要求的行為,例如有號整數溢位、陣列範圍外的參考、參考 NULL 指標、釋放後使用等。程式可能碰巧照預期運作,但編譯器可以假設「正確的程式中不會發生」來進行最佳化,因此只要改變最佳化設定或編譯器版本,結果就可能改變。相對地,像 int 的大小、char 是否有號這類由處理系統決定且必須寫在文件中的事項,稱為實作定義行為。gcc 或 clang 加上 -fsanitize=undefined,可以在執行時偵測部分未定義行為。
- A. 正確。標準不作任何要求,因此任何結果都不違反標準。
- B. 這是實作定義行為的說明。int 的大小或 char 有無符號屬於此類。
- C. 標準並未要求偵測。多數情況下,會在沒有任何通知的情況下得到錯誤的結果。