"Thinking in Java,2nd Edition"的第4章,第231页中的"数组初始化"部分有这样的说法:
在C中初始化数组容易出错且乏味.C++使用聚合初始化使其更安全.Java没有像C++这样的"聚合",因为Java中的所有东西都是对象.它有阵列,阵列初始化支持这些阵列.
为什么C中容易出错且乏味?聚合初始化是什么意思,为什么它更安全?我在Bruce Eckel的"Thinking in C++"(第2版)中遇到了"聚合初始化"这一章,但它并没有让我相信任何事情.
jog*_*pan 20
首先,回答主要问题,聚合初始化意味着使用大括号括起初始化列表来初始化聚合的所有成员(即数组或结构[在C++中,只有某些类型的结构计为聚合]).
明显,
int ar[] = { 1 , 2 };
Run Code Online (Sandbox Code Playgroud)
比...更安全
int ar[2];
ar[0] = 1;
ar[1] = 2;
Run Code Online (Sandbox Code Playgroud)
因为后者为初始化各个元素的索引中的拼写错误和其他错误提供了充分的机会.
看看今天的C和C++,我不清楚为什么作者区分C和C++.两种语言都支持数组的聚合初始化.
一种可能性是作者提到了C标准的旧版本.值得注意的是,在ANSI C(C89)中,一个重要的限制应用于聚合初始化:所有初始化器必须是常量表达式:
/* This is possible in C89: */
f(int i)
{ int ar[] = { 1 , 2 }; }
/* But this is not
(because i is not a constant expression):
*/
f(int i)
{ int ar[] = { i , i+1 }; }
Run Code Online (Sandbox Code Playgroud)
这是由于C89中的3.5.7(引自我在这里找到的草案):
具有静态存储持续时间的对象的初始值设定项中的所有表达式或具有聚合或联合类型的对象的初始化列表中的所有表达式都应为常量表达式.
这显然限制了聚合初始化的有用性(甚至在1989年,我相信许多编译器实现了扩展,以便为非常量表达式启用聚合初始化).
C标准的后续版本没有这个限制,我相信C++的标准化版本(从C++ 98开始)从未有过这样的限制.
我只能推测,但也许这就是作者的想法?
| 归档时间: |
|
| 查看次数: |
10165 次 |
| 最近记录: |