晕了,恒量竟然不能作为静态数组的大小?

晕了,常量竟然不能作为静态数组的大小??
int i=1;
int j=(int)&i;
int a[(int)&i];
为什么(int)&i作为常量可以为全局变量j初始化,却不能作为静态数组的大小。

好奇怪啊,何解???
------解决方案--------------------
引用:
int i=1;
int j=(int)&i;
int a[(int)&i];
为什么(int)&i作为常量可以为全局变量j初始化,却不能作为静态数组的大小。

好奇怪啊,何解???


你有两个误区,一是以为由常量表达式通过一定运算得出的结果也属于常量表达式,这个观念是错的。&i的结果是地址常量表达式这个没错,但是( int )&i的结果却非整数常量表达式,因为在C中(C++也类似,但有细微差别),显式转换产生的整数常量表达式只能由数值类型转换而来,何谓数值类型?就是整数类型和浮点类型,&i的结果是个指针,属于标量类型,但不是数值类型。即:

int a[(int)18.2]是合法的,但int a[ (int)&i ]不是合法的

但是,你可能会产生另一个疑问,既然(int)&i不是常量表达式,为什么可以用来初始化j?

在这里你存在第二个误区,以为具有静态存储周期的变量的初始化器必须是常量表达式(也是很多书的误区),非也。

C仅规定构成静态存储周期变量的初始化器或初始化列表中的所有表达式应为常量表达式,但并无规定必须作为一个完整表达式出现,即,仅要求各个子表达式必须是常量表达式,因此int j=(int)&i是合法的。
------解决方案--------------------
supermegaboy   整天都看什么书!?