int x = 5 之间的差异;和 int x = {5}

use*_*309 4 c initialization initializer-list

这两个语句的作用是相同的:

int x = 5;
Run Code Online (Sandbox Code Playgroud)
int x = {5};
Run Code Online (Sandbox Code Playgroud)

当我尝试时也是如此:

char str[] = "hello";
Run Code Online (Sandbox Code Playgroud)
char str[] = {"hello"};
Run Code Online (Sandbox Code Playgroud)

该语言如何定义使用花括号初始化变量?

Lun*_*din 9

这里适用三种不同的初始化情况:

\n
    \n
  • 对于普通变量/指针,正式称为标量,然后 C17 6.7.9 \xc2\xa711 表示如果您愿意,您可以选择添加大括号:

    \n
    \n

    标量的初始值设定项应为单个表达式,可以选择用大括号括起来。

    \n
    \n
  • \n
  • 然后 \xc2\xa714 特别提到了字符数组 - 它们可以用字符串文字初始化。他们也可以选择带大括号:

    \n
    \n

    字符类型数组可以由字符串文字或 UTF\xe2\x80\x938 字符串文字初始化,可以选择用大括号括起来。

    \n
    \n
  • \n
  • 最后,\xc2\xa716 处理聚合的所有其他初始值设定项,大括号不再是可选的而是强制的:

    \n
    \n

    否则,具有聚合或联合类型的对象的初始值设定项应为元素或命名成员的用大括号括起来的初始值设定项列表。

    \n
    \n
  • \n
\n

这使得{}无论初始化器列表正在初始化哪种类型,都可以使用一致的语法编写所有初始化器列表。在编写类型通用宏和类似宏时,这可能会很方便。

\n