讨论一个程序(常量数组和普通常量const)
测试程序:#include <iostream>
using namespace std;
int main()
{
int const c1=4;
int const c2[1]={2};
*(int *)&c1=5;
*(int *)&c2[0]=9;
cout<<c1+c2[0]<<endl;
return 0;
}
using namespace std;
int main()
{
int const c1=4;
int const c2[1]={2};
*(int *)&c1=5;
*(int *)&c2[0]=9;
cout<<c1+c2[0]<<endl;
return 0;
}
结果如何?
----------------解决方案--------------------------------------------------------
你的blog背景音乐不错,叫啥名字啊
----------------解决方案--------------------------------------------------------
谢欣雨的 天仙子
----------------解决方案--------------------------------------------------------
输出13~
----------------解决方案--------------------------------------------------------
此贴作废
[此贴子已经被作者于2007-11-19 11:52:58编辑过]
----------------解决方案--------------------------------------------------------
我运行的就只有13.在vc6.0下
----------------解决方案--------------------------------------------------------
此贴作废
[此贴子已经被作者于2007-11-19 11:52:36编辑过]
----------------解决方案--------------------------------------------------------
LS能说一下原因么,我还不理解怎么会出现这样的情况~
----------------解决方案--------------------------------------------------------
-> const <-
int const c1=4; // 作为立即数存在
int const c2[1]={2}; // 存储在内存地址中,通过地址访问
*(int *)&c1=5; // 不能改变立即数的值,立即数是直接的数字
*(int *)&c2[0]=9; // 这行代码进行了强制赋值
cout<<c1+c2[0]<<endl; // cout<<4+c2[0]<<endl;
4 + 9 = 13 // C++ 中居然是这个结果
// C 因该是 14 或 6
//------------------------------------------------------------------------------
优化后“c2[1]={2};”也作为立即数,因为这个只有1个元素,把c[0]直接当成数字2,并且是使用const声明的,所以编译器认为它是不会被改变的。不过这是经过优化的。
-
-
[此贴子已经被作者于2007-11-18 22:08:37编辑过]
----------------解决方案--------------------------------------------------------
以下是引用cosdos在2007-11-18 21:45:44的发言:
我使用的是 DEV-C++
不优化的情况下 13
开启进一步 优化的情况下为 6
开启优化的情况下作为立即数处理。只限于符合立即数要求的数。
这可不一样,你没发觉c1没有改变,而c2[0]改变了吗?
----------------解决方案--------------------------------------------------------