50

偶然我发现该行char s[] = {"Hello World"};已正确编译并且似乎与char s[] = "Hello World";. 第一个 ( {"Hello World"}) 不是一个包含一个元素的数组,它是一个 char 数组,所以 s 的声明应该是 schar *s[]吗?实际上,如果我将其更改为char *s[] = {"Hello World"};编译器,也会像预期的那样接受它。

寻找答案,我发现唯一提到这个的地方就是这个,但没有引用标准。

所以我的问题是,char s[] = {"Hello World"};尽管左侧是 typearray of char而右侧是type ,但为什么要编译该行array of array of char

以下是一个工作程序:

#include<stdio.h>
int main() {
    char s[] = {"Hello World"};
    printf("%s", s); // Same output if line above is char s[] = "Hello World";
    return 0;
}

感谢您的任何澄清。

PS 我的编译器是 gcc-4.3.4。

4

6 回答 6

65

这是允许的,因为标准是这样说的:C99 第 6.7.8 节,第 14 节:

字符类型的数组可以由字符串字面量初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。

这意味着两者

char s[] = { "Hello World" };

char s[] = "Hello World";

只不过是语法糖

char s[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', 0 };

在相关说明(同一部分,§11)中,C 还允许在标量初始化器周围使用大括号,例如

int foo = { 42 };

顺便说一句,它非常适合复合文字的语法

(int){ 42 }
于 2012-04-13T19:50:10.193 回答
22

大括号是可选的,表达式仅相当于一个 char 数组。

你也可以这样写:

 int a = {100}; //ok

演示:http: //ideone.com/z0psd

事实上,C++11概括了这种语法,统一初始化非数组和数组。所以在 中C++11,你可以拥有这些:

int a{}; //a is initialized to zero, and it is NOT an array

int b[]{1,2,3,4}; //b is an array of size 4 containing elements 1,2,3,4

int c[10]{}; //all 10 elements are initialized to zero

int *d{}; //pointer initialized to nullptr

std::vector<int> v{1,2,3,4,5}; //vector is initialized uniformly as well.
于 2012-04-13T19:45:10.227 回答
4

int( ,等) 中的任何变量char都只是一个长度为 1 的数组。

char s = {0};

也可以。

于 2012-04-13T19:46:21.660 回答
2

我可能错了,但我认为这不是一个字符数组数组,而是一个块包含一个字符数组。int a = {1};也可以工作。

于 2012-04-13T19:45:43.640 回答
1

[...] 实际上,如果我将其更改为 char *s[] = {"Hello World"}; 正如预期的那样,编译器也接受它

编译器接受它,因为实际上,您正在制作一个包含未定义大小元素的二维数组,其中仅存储一个元素,即"Hello World"字符串。像这样的东西:

char* s[] = {"Hello world", "foo", "baa" ...};

bracets在这种情况下,您不能省略。

于 2012-04-13T20:19:44.620 回答
1

C++ 标准也允许这样做,引用:

[dcl.init.string] §1

窄字符类型的数组 ([basic.fundamental])、char16_t 数组、char32_t 数组或 wchar_t 数组可以分别由窄字符串文字、char16_t 字符串文字、char32_t 字符串文字或宽字符串文字初始化,或者通过括在大括号中的适当类型的字符串文字([lex.string])。[剪辑]

于 2016-07-29T10:56:17.020 回答