以下程序输出是____。
1
2
3
4
5
6
7
8
9
10
|
#include <iostream>
using namespace std;
int
main(
void
)
{
const
int
a =
10
;
int
* p = (
int
*)(&a);
*p =
20
;
cout<<
"a = "
<<a<<
", *p = "
<<*p<<endl;
return
0
;
}
a = 10, *p = 20
因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠.
这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;
但是在运行阶段,它的内存里存的东西确实改变了!!!
简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。
|