以下程序输出是____。
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的时候,编译器会将其变成一个立即数。
|