Braces around string literal in char array declaration valid? (e.g. char s[] = {“Hello World”})

前端 未结 6 543
我在风中等你
我在风中等你 2020-12-03 06:32

By accident I found that the line char s[] = {\"Hello World\"}; is properly compiled and seems to be treated the same as char s[] = \"Hello World\";

相关标签:
6条回答
  • The braces are optional, and the expression is equivalent to just an array of char.

    You can also write this:

     int a = {100}; //ok
    

    Demo : http://ideone.com/z0psd

    In fact, C++11 generalizes this very syntax, to initialize non-arrays as well as arrays, uniformly. So in C++11, you can have these:

    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.
    
    0 讨论(0)
  • 2020-12-03 07:01

    Any variable in (int, char, etc.) is just an array of length 1.

    char s = {0};
    

    works as well.

    0 讨论(0)
  • 2020-12-03 07:05

    [...] In fact if I change it to char *s[] = {"Hello World"}; the compiler accepts it as well, as expected

    The compiler accepets it,because actually, you're making an array 2D of undefined size elements,where you stored one element only,the "Hello World" string. Something like this:

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

    You can't omit the bracets in this case.

    0 讨论(0)
  • 2020-12-03 07:14

    This is allowed by the C++ standard as well, Citation:

    [dcl.init.string] §1

    An array of narrow character type ([basic.fundamental]), char16_t array, char32_t array, or wchar_t array can be initialized by a narrow string literal, char16_t string literal, char32_t string literal, or wide string literal, respectively, or by an appropriately-typed string literal enclosed in braces ([lex.string]). [snip]

    0 讨论(0)
  • 2020-12-03 07:16

    I might be wrong, but I think this is not an array of arrays of chars, but a block contains an array of chars. int a = {1}; may work as well.

    0 讨论(0)
  • 2020-12-03 07:17

    It's allowed because the standard says so: C99 section 6.7.8, §14:

    An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

    What this means is that both

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

    and

    char s[] = "Hello World";
    

    are nothing more than syntactic sugar for

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

    On a related note (same section, §11), C also allows braces around scalar initializers like

    int foo = { 42 };
    

    which, incidentally, fits nicely with the syntax for compound literals

    (int){ 42 }
    
    0 讨论(0)
提交回复
热议问题