int x = 5; 和 int x = {5} 之间的区别是什么?

4

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

int x = 5;

int x = {5};

当我尝试时,这也是正确的:

char str[] = "hello";

char str[] = {"hello"};

使用花括号初始化变量在编程语言中是如何定义的?


1
这可能会对您有所帮助:https://dev59.com/3GMl5IYBdhLWcg3wqIdh#18222927 - Utkarsh Sahu
3
这是关于C语言的,而不是关于C++。 - T.J. Crowder
@T.J.Crowder 除了涉及对象和类的情况外,C语言和C++在变量方面有相似的行为... - Utkarsh Sahu
@UtkarshSahu - 当然,有很多很多的区别。:-) 但是单独来看,除非你计算 auto z2 = {99};,否则我在那个答案中没有看到上面提到的内容。可能是因为我的 C 大脑生锈了(而且确实非常生锈)。 - T.J. Crowder
@Jean-Baptiste Yunès,这并不是一个很好的重复问题。答案非常糟糕,而且str []不是标量而是一个聚合体。这个问题更加直接,所以我们可能在这里得到更好的答案(然后也许关闭你链接的那个)。投票重新打开。 - Lundin
显示剩余4条评论
2个回答

9
这里有三种不同的初始化情况:
1. 对于普通变量/指针,也称为标量,C17 6.7.9 §11规定,如果您愿意,可以选择添加大括号:
“The initializer for a scalar shall be a single expression, optionally enclosed in braces.”
2. 然后 §14 特别提到字符数组 - 它们可以使用字符串字面值进行初始化。同样,它们也可以选择使用大括号:
“An array of character type may be initialized by a character string literal or UTF–8 string literal, optionally enclosed in braces.”
3. 最后,§16 处理聚合类型(数组或结构体)和联合体的所有其它初始值设置,此时大括号不再是可选项,而是强制性的:
“Otherwise, the initializer for an object that has aggregate or union type shall be a brace-enclosed list of initializers for the elements or named members.”
这使得写所有初始值列表成为可能,具有一致的语法并使用 {},无论初始化列表正在初始化哪种类型。这在编写类型通用宏等情况下可能很方便。

4
没有区别。在C11标准中,§6.7.9p11描述了这种情况:

标量的初始化器应该是一个单独的表达式,可以用大括号括起来。对象的初始值是表达式的值(转换后); 与简单赋值相同的类型约束和转换适用于标量的类型,其类型为已声明类型的未限定版本。

整数和指针都是标量类型(参见§6.2.5p21)。
(在C89中也是相同的,只是文档链接不太好)。

2
char str[] 不是一个标量,而是一个聚合体。但实际上,字符数组有一个特殊的初始化规则。这只回答了问题的第一部分,而没有回答第二部分。 - Lundin
@Lundin 您是正确的,我不知怎么把 char *p = {"abc"}char p[] = {"abc"} 搞混了。 - Simon Doppler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接