高手进!我都无语了。。。。

FengPrince 2012-11-29 08:45:08
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的确是常量,但第三语句为数组指定大小却又不行。

有高手查阅到相关的标准吗,对左值求得的地址值算不算常量???
我印象中是地址常量。。。
...全文
81 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2012-11-29
  • 打赏
  • 举报
回复
你有两个误区,一是以为由常量表达式通过一定运算得出的结果也属于常量表达式,这个观念是错的。&i的结果是地址常量表达式这个没错,但是( int )&i的结果却非整数常量表达式,因为在C中(C++也类似,但有细微差别),显式转换产生的整数常量表达式只能由数值类型转换而来,何谓数值类型?就是整数类型和浮点类型,&i的结果是个指针,属于标量类型,但不是数值类型。即: int a[(int)18.2]是合法的,但int a[ (int)&i ]不是合法的 但是,你可能会产生另一个疑问,既然(int)&i不是常量表达式,为什么可以用来初始化j? 在这里你存在第二个误区,以为具有静态存储周期的变量的初始化器必须是常量表达式(也是很多书的误区),非也。 C仅规定构成静态存储周期变量的初始化器或初始化列表中的所有表达式应为常量表达式,但并无规定必须作为一个完整表达式出现,即,仅要求各个子表达式必须是常量表达式,因此int j=(int)&i是合法的。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧