6

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

版本 1:

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

版本 2:

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

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

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

4

5 回答 5

3

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

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

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

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

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

于 2013-09-25T18:58:27.920 回答
2

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

于 2013-09-25T18:55:12.957 回答
2

这就是为什么

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

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}; 
于 2013-09-25T18:55:13.977 回答
1

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

于 2013-09-25T19:02:41.123 回答
1

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

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

于 2013-09-25T18:55:47.710 回答