当前位置: 华文星空 > 知识

C语言函数中用const 定义的常量是存放在内存的静态存储区的吗?

2021-05-06知识

其实,用 const 修饰的变量从来就不是常量……这是人们一厢情愿的叫法。

像 42、3.14、'a'、枚举这些才叫常量。你定义出来的都是变量, const 修饰之后也只是把变量所代表的对象标记为「修改会造成未定义行为」。(如果是 C++ 的话,这种变量所代表的对象有个专门的名字叫 const 对象。)

程序员:修改会造成未定义行为→我们对未定义行为充满恐惧→我们不希望去修改它→我们觉得它只读→要不干脆就叫他常量吧

而编译器的优化一般都会利用未定义行为:

编译器:未定义行为就是对结果不作要求→直接认为代码不可能触发未定义行为→如果存在,那么它爱发什么发生什么,我编译器不管

所以处理 const 修饰的变量时,编译器就会认为代码不可能对其进行修改,合适的话就可能会做放到静态存储区、变成立即数之类的操作。

---

我觉得既然问题问的是「C 语言中如何如何」,那么纸上谈兵比看汇编要高效地多。

自然科学需要通过实践观察来总结自然规律,如果规律不符合观察,是规律总结错了;编程是反的,规律就写在文档里,如果实践观察不符合规律,那东西叫做 bug。

不过看汇编是不错的确定未定义行为的手段,因为未定义行为不一定有文档(要求有文档的就是「未说明行为」了),我们又回到了自然科学找规律的范畴。