http://bbs.csdn.net/topics/390299297?page=1#post-393063562
以下C代码位于函数体外:(非C++)
int i=1;
int j=(int)&i;
int a[(int)&i];
为什么第二条语句正确,而第三条却不正确??
PS:之前发个帖子,见上,都什么人在回答啊,有些人还不屑一顾的。。。
鉴于在C++版块,改为C++吧。
以下C++代码位于main内:
int i=1;
const int j=(int)&i;
int* p=(int*)&j;
cout<<j<<endl;
cout<<*p<<endl;
*p=250;
cout<<j<<endl;
cout<<*p<<endl;
运行可以发现,j并非常量,应该是运行时求值的,而非编译期。
所以,在以下代码块添加int a[j];或int a[(int)&i];会编译出错,于情理之中。(我GCC加了-pedantic-errors关闭G++VLA扩展)
问题是据我所知,&i属于地址常量,编译期求值,这一点在C代码里有佐证,全局变量只能由常量赋初始值,而 int j=(int)&i;语句编译时并无问题,说明&i的确是常量,但第三语句为数组指定大小却又不行。
有高手查阅到相关的标准吗,对左值求得的地址值算不算常量???
我印象中是地址常量。。。