为什么不允许任意赋值使用 C 数组初始化语法?



我试图学习Java中的数组基础知识,这个问题出现了:

版本1:

int[] x  = {12,34,56,78};

版本2:

int[] x;  
x = {12,34,56,78};
版本

1 正确,但版本 2 不正确。

为什么会这样呢?它背后的故事是什么?
请从面向编译器的角度描述这一点。

编译器需要知道在声明数组时要为数组分配多少存储空间。

int x[] = {12,34,56,78};

在这种情况下,编译器知道它需要存储四个整数; 这相当于说int x[4]

int x[];
/* ... */
x = {12,34,56,78};

但是,在这种情况下,编译器看到int x[]并知道它必须为数组分配空间,但它不知道多少,直到它到达下一行,此时为时已晚。

在后一种情况下,编译器需要处理的第一行只是int x[];。编译器不知道要制作数组多长时间,除非您int x[4];给数组一个长度或给它一个初始值,允许它确定长度。

原因如下

这是使用数组初始化语法的变量声明和初始化:

int[] x = {12,34,56,78}; // this is java. my bad
int x[] = {12,34,56,78}; // this is c

这是变量声明操作:

int[] x; // java again
int x[]; // this is c

只有在声明变量时,才允许初始化变量(包括使用数组初始化语法)。

这是带有语法错误的变量赋值:

x = {12,34,56,78}; 

这里看起来像赋值的东西实际上是初始化。此类语法只能用作声明的一部分,而不能用作独立表达式。

此语法的两个部分(=符号的左侧和右侧)协同工作:编译器从初始值设定项中的项数派生数组int x[]的大小;它不能在以后添加到x类型中,即在进行赋值时, 因为 C 数组的大小必须在声明点知道。

简单...版本 2 不知道如何为数组值分配空间

最新更新