char数组声明形式的区别
Difference between char array declaration forms
我们在编程考试中遇到了这个问题,大家都在讨论正确答案,你觉得呢?
3.1 以下哪项是错误的字符串初始化?
(a) char plant[] = "Tree";
(b) char plant[] = {'T','R','E','E'};
(c) char plant[80] = "Tree";
(d) char plant[80] = {'T','R','E','E'};
(e) None of the above
提前致谢:)
它们在语法上都是有效的,但我假设问题倾向于 (b)
将简单地创建一个 char [4]
- 也就是说,它不会以 null 终止,而其他三个将是。
C99 和 C11 标准草案明确定义了 string 以 null 结尾:7 Library 7.1.1 Definitions “A string是由第一个空字符终止并包括第一个空字符的连续字符序列。”如此定义的术语“字符串”——不仅仅是库中的约定——“不正确的字符串初始化”(如问题中所指)可能是不包含空字符的字符串。
C11 标准在 6.7.9 ¶22 中规定“如果初始化未知大小的数组,则其大小由具有显式初始化程序的最大索引元素确定。” C99 6.7.8 ¶22 说的一样。这是 (b) 中的情况,因此未终止且不正确:
char plant[] = {'T','R','E','E'};
6.7.9 /6.7.8 ¶21 “如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同”; ¶10 说这样的对象充满了(各种)零;这意味着 (c) 和 (d) 以 null 结尾:
char plant[80] = "Tree";
char plant[80] = {'T','R','E','E'};
6.7.9 / 6.7.8 ¶14 说“字符类型的数组可以由字符串文字初始化,可选地用大括号括起来。字符串文字的连续字符(包括终止空字符如果有空间或如果数组大小未知)初始化元素阵列。”这意味着这 (a) 是空终止的:
char plant[] = "Tree";
我们在编程考试中遇到了这个问题,大家都在讨论正确答案,你觉得呢?
3.1 以下哪项是错误的字符串初始化?
(a) char plant[] = "Tree";
(b) char plant[] = {'T','R','E','E'};
(c) char plant[80] = "Tree";
(d) char plant[80] = {'T','R','E','E'};
(e) None of the above
提前致谢:)
它们在语法上都是有效的,但我假设问题倾向于 (b)
将简单地创建一个 char [4]
- 也就是说,它不会以 null 终止,而其他三个将是。
C99 和 C11 标准草案明确定义了 string 以 null 结尾:7 Library 7.1.1 Definitions “A string是由第一个空字符终止并包括第一个空字符的连续字符序列。”如此定义的术语“字符串”——不仅仅是库中的约定——“不正确的字符串初始化”(如问题中所指)可能是不包含空字符的字符串。
C11 标准在 6.7.9 ¶22 中规定“如果初始化未知大小的数组,则其大小由具有显式初始化程序的最大索引元素确定。” C99 6.7.8 ¶22 说的一样。这是 (b) 中的情况,因此未终止且不正确:
char plant[] = {'T','R','E','E'};
6.7.9 /6.7.8 ¶21 “如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同”; ¶10 说这样的对象充满了(各种)零;这意味着 (c) 和 (d) 以 null 结尾:
char plant[80] = "Tree";
char plant[80] = {'T','R','E','E'};
6.7.9 / 6.7.8 ¶14 说“字符类型的数组可以由字符串文字初始化,可选地用大括号括起来。字符串文字的连续字符(包括终止空字符如果有空间或如果数组大小未知)初始化元素阵列。”这意味着这 (a) 是空终止的:
char plant[] = "Tree";