指定初始化项目(C99)
2013-01-16 22:24
155 查看
C99增加了一种新特性:指定初始化项目(designated initializer)。此特性允许选择对某些元素进行初始化。
数组的指定初始化项目
例如:要对数组的最后一个元素初始化。按照传统的C初始化语法,需要对每一个元素都初始化之后,才可以对最后的元素进行初始化:
而C99规定,在初始化列表中使用带有方括号的元素下标可以指定某个特定的元素:
对于通常的初始化,在初始化一个或多个元素后,未经初始化的元素都将被设置为0。
附加的指定初始化规则:
1. 如果在一个指定初始化项目后跟有不止一个值,则这些数值将用来对后续的数组元素初始化。
2. 如果多次对一个元素进行初始化,则最后的一次有效。
代码示例:
输出:
1 31
2 29
3 0
4 0
5 31
6 30
7 31
8 0
9 0
10 0
11 0
12 0
结构的指定初始化项目
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目相似。只是,结构的指定初始化项目使用点运算符和成员名来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
可以按照任意的顺序使用指定初始化项目。跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员之后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值:
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
ref: 《C Primer Plus》
数组的指定初始化项目
例如:要对数组的最后一个元素初始化。按照传统的C初始化语法,需要对每一个元素都初始化之后,才可以对最后的元素进行初始化:
int arr[6] = {0, 0, 0, 0, 0, 212} // 传统语法
而C99规定,在初始化列表中使用带有方括号的元素下标可以指定某个特定的元素:
int arr[6] = {[5] = 212}; // 把arr[5]初始化为212
对于通常的初始化,在初始化一个或多个元素后,未经初始化的元素都将被设置为0。
附加的指定初始化规则:
1. 如果在一个指定初始化项目后跟有不止一个值,则这些数值将用来对后续的数组元素初始化。
2. 如果多次对一个元素进行初始化,则最后的一次有效。
代码示例:
// 使用指定初始化项目 #include <stdio.h> #define MONTHS = 12 int main (void) { int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29}; int i; for (i = 0; i < MONTHS; i++) printf("%2d %d\n", i + 1; days[i]); return 0; }
输出:
1 31
2 29
3 0
4 0
5 31
6 30
7 31
8 0
9 0
10 0
11 0
12 0
结构的指定初始化项目
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目相似。只是,结构的指定初始化项目使用点运算符和成员名来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
struct book surprise = {.value = 10.99};
可以按照任意的顺序使用指定初始化项目。跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员之后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值:
struct book gift = { .value = 18.90, .author = "James Broadfool", 0.25 };
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
ref: 《C Primer Plus》
相关文章推荐
- c99 指定初始化项目
- 【数组】C99的新特性:指定初始化项目
- 例解GNU C之指定初始化项目
- C99 结构体指定初始化
- 关于C99中的新特性:指定初始化 Designated initializers
- C99 Designated initializers(结构体指定初始化)
- C99 指定初始化
- 例解GNU C之指定初始化项目
- C99 Designated initializers(结构体指定初始化)
- C99的指定初始化转化为C89?用(a|e)?bnf实现吧,写个玩玩
- 例解GNU C之指定初始化项目
- C99标准支持结构体按成员名称进行指定初始化。
- 数组初始化:指定初始化项目
- C99 结构体指定初始化
- 关于ligerUi的ligertree的初始化默认选中指定项目的方法
- 2.6版Linux内核中涉及的结构体指定初始化项目解析
- 例解GNU C之指定初始化项目
- 项目启动 spring初始化bean之后执行指定方法
- node 项目初始化
- 如何为WAR项目指定Resin classpath