其實,用
const
修飾的變量從來就不是常量……這是人們一廂情願的叫法。
像 42、3.14、'a'、列舉這些才叫常量。你定義出來的都是變量,
const
修飾之後也只是把變量所代表的物件標記為「修改會造成未定義行為」。(如果是 C++ 的話,這種變量所代表的物件有個專門的名字叫 const 物件。)
而編譯器的最佳化一般都會利用未定義行為:
編譯器:未定義行為就是對結果不作要求→直接認為程式碼不可能觸發未定義行為→如果存在,那麽它愛發什麽發生什麽,我編譯器不管
所以處理
const
修飾的變量時,編譯器就會認為程式碼不可能對其進行修改,合適的話就可能會做放到靜態儲存區、變成立即數之類的操作。
---
我覺得既然問題問的是「C 語言中如何如何」,那麽紙上談兵比看組譯要高效地多。
自然科學需要透過實踐觀察來總結自然規律,如果規律不符合觀察,是規律總結錯了;編程是反的,規律就寫在文件裏,如果實踐觀察不符合規律,那東西叫做 bug。
不過看組譯是不錯的確定未定義行為的手段,因為未定義行為不一定有文件(要求有文件的就是「未說明行為」了),我們又回到了自然科學找規律的範疇。