其实,用
const
修饰的变量从来就不是常量……这是人们一厢情愿的叫法。
像 42、3.14、'a'、枚举这些才叫常量。你定义出来的都是变量,
const
修饰之后也只是把变量所代表的对象标记为「修改会造成未定义行为」。(如果是 C++ 的话,这种变量所代表的对象有个专门的名字叫 const 对象。)
而编译器的优化一般都会利用未定义行为:
编译器:未定义行为就是对结果不作要求→直接认为代码不可能触发未定义行为→如果存在,那么它爱发什么发生什么,我编译器不管
所以处理
const
修饰的变量时,编译器就会认为代码不可能对其进行修改,合适的话就可能会做放到静态存储区、变成立即数之类的操作。
---
我觉得既然问题问的是「C 语言中如何如何」,那么纸上谈兵比看汇编要高效地多。
自然科学需要通过实践观察来总结自然规律,如果规律不符合观察,是规律总结错了;编程是反的,规律就写在文档里,如果实践观察不符合规律,那东西叫做 bug。
不过看汇编是不错的确定未定义行为的手段,因为未定义行为不一定有文档(要求有文档的就是「未说明行为」了),我们又回到了自然科学找规律的范畴。