知识点来源于c++常量折叠。
首先,先看牛客网上c++的一道题目:
在c++中,以下程序代码输出是? 答案是 (0, 1)
const int i = 0;
int *j = (int *) &i;
*j = 1;
printf("%d,%d", i, *j)
就感觉很神奇, j j 指向的是所在的位置,如果能够这样强制修改,那么const的作用就不复存在了,但是如果不可以修改,那么感觉强制类型转换后让 j j 指向它就不应该允许通过。但是,c++并没有这样严谨的处理,而简单采用了一种叫做c++常量折叠的方式。
- const int i = 0; 定义完成就应该类似宏定义一样,变为一个固定的常量。从此以后,作用域见到 i i 就是0。
- 但是 毕竟是一个变量,c++为其分配了一个空间。而只有是有空间的,就意味着人总有办法搞到该地址然后偷偷去读去写。c++管不了这个,所以只能偷懒,那就是cpu默认只读取一次变量 i i 的值,后面即使它被修改,cpu也假装不知道,继续用之前的值。
但是问题来了,如果在const int定义的变量前面强行加上一个violatile,也就是说强行让cpu在以后使用之前必须要从寄存器中读取新的值,那么这道题的答案就是1,1
。