char数组声明中的stringstring大括号有效吗? (如char s = {“Hello World”})

意外的发现,行char s[] = {"Hello World"}; 是正确的编译,似乎被视为与char s[] = "Hello World"; 。 不是第一个( {"Hello World"} )一个包含一个char数组元素的数组,所以s的声明应该读取char *s[] ? 事实上,如果我把它改为char *s[] = {"Hello World"}; 编译器也会接受它,如预期的那样。

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

所以我的问题是,为什么行char s[] = {"Hello World"}; 编译虽然左侧的array of chartypesarray of char和右侧array of array of chartypes?

以下是一个工作计划:

 #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。

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

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

这意味着两者

 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 } 

大括号是可选的,expression式相当于一个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. 

intchar等)中的任何variables只是一个长度为1的数组。

 char s = {0}; 

也适用。

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

事实上,如果我把它改为char * s [] = {“Hello World”}; 编译器也会接受它,如预期的那样

编译器支持它,因为实际上,你正在创build一个未定义大小元素的数组2D,其中只存储了一个元素,即"Hello World"string。 像这样的东西:

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

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

这也是C ++标准所允许的,Citation:

[dcl.init.string]§1

窄字符types([basic.fundamental]),char16_t数组,char32_t数组或wchar_t数组可以分别由一个窄string文字,char16_tstring文字,char32_tstring文字或宽string文字初始化, 或者由一个用大括号 ([lex.string]) 括起来的适当types的string文字。 [剪断]