當前位置: 華文星空 > 知識

C語言函數中用const 定義的常量是存放在記憶體的靜態儲存區的嗎?

2021-05-06知識

其實,用 const 修飾的變量從來就不是常量……這是人們一廂情願的叫法。

像 42、3.14、'a'、列舉這些才叫常量。你定義出來的都是變量, const 修飾之後也只是把變量所代表的物件標記為「修改會造成未定義行為」。(如果是 C++ 的話,這種變量所代表的物件有個專門的名字叫 const 物件。)

程式設計師:修改會造成未定義行為→我們對未定義行為充滿恐懼→我們不希望去修改它→我們覺得它唯讀→要不幹脆就叫他常量吧

而編譯器的最佳化一般都會利用未定義行為:

編譯器:未定義行為就是對結果不作要求→直接認為程式碼不可能觸發未定義行為→如果存在,那麽它愛發什麽發生什麽,我編譯器不管

所以處理 const 修飾的變量時,編譯器就會認為程式碼不可能對其進行修改,合適的話就可能會做放到靜態儲存區、變成立即數之類的操作。

---

我覺得既然問題問的是「C 語言中如何如何」,那麽紙上談兵比看組譯要高效地多。

自然科學需要透過實踐觀察來總結自然規律,如果規律不符合觀察,是規律總結錯了;編程是反的,規律就寫在文件裏,如果實踐觀察不符合規律,那東西叫做 bug。

不過看組譯是不錯的確定未定義行為的手段,因為未定義行為不一定有文件(要求有文件的就是「未說明行為」了),我們又回到了自然科學找規律的範疇。