C語言基礎

關於C語言標準所說的未定義行為,下列說明何者正確?

  1. A標準沒有作任何規定的行為,編譯器可以假設它不會發生來進行最佳化,也可能出現意料之外的結果
  2. B由各處理系統決定結果,並且有義務把結果寫在文件中的行為
  3. C在執行時一定會被偵測,顯示錯誤訊息並停止程式的行為
查看答案與解析

正確答案:A. 標準沒有作任何規定的行為,編譯器可以假設它不會發生來進行最佳化,也可能出現意料之外的結果

未定義行為是標準不作任何要求的行為,例如有號整數溢位、陣列範圍外的參考、參考 NULL 指標、釋放後使用等。程式可能碰巧照預期運作,但編譯器可以假設「正確的程式中不會發生」來進行最佳化,因此只要改變最佳化設定或編譯器版本,結果就可能改變。相對地,像 int 的大小、char 是否有號這類由處理系統決定且必須寫在文件中的事項,稱為實作定義行為。gcc 或 clang 加上 -fsanitize=undefined,可以在執行時偵測部分未定義行為。

  • A. 正確。標準不作任何要求,因此任何結果都不違反標準。
  • B. 這是實作定義行為的說明。int 的大小或 char 有無符號屬於此類。
  • C. 標準並未要求偵測。多數情況下,會在沒有任何通知的情況下得到錯誤的結果。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. int 與 unsigned int 為32位元。下列何者依C語言的標準屬於未定義行為?
  2. 以 gcc 啟用最佳化來編譯上方的函式時,if (p == NULL) 的判斷可能被刪除。其理由為下列何者?
  3. C語言的標準中,關於 int 型別的大小有何規定?下列何者正確?
  4. 在嵌入式程式中,存放32位元周邊暫存器值的變數,常以 stdint.h 的 uint32_t 宣告,而不是 unsigned int。主要理由為下列何者?
  5. 執行上方含有整數除法的程式碼時的輸出,下列何者正確?