整型变量的奇怪C/C++初始化语法

5
以下代码片段可以通过 C/C++ 编译器完美编译:
#include <stdio.h>
int main()
{
    int x = {5};         //<-- why this compiles?
    printf("x = %d",x);
    return 0;
}

输出为5x在此处以复合类型形式进行初始化,尽管它是整数类型。我想了解这里进行了哪些转换以及为什么要这样做。

2
这意味着“将第一件事初始化为5”。由于只有一件事,因此这按预期工作。 - David Schwartz
@DavidSchwartz 参考文献是什么?为什么? - SomeWittyUsername
通常我们会这样声明:char s[10] = {"hello"};,你可以去掉 {} - Grijesh Chauhan
2个回答

8

C语言允许这样做:

(C99, 6.7.8p11) "标量类型的初始化表达式应为单个表达式,也可以用大括号括起来。"

C++11中也有类似的规定,详见8.5.4p1。


不错,我不知道。那C++呢?我也用非C99编译器编译了它:http://ideone.com/aWsjAd - SomeWittyUsername
明白了,我还找到了这个问题:https://dev59.com/lmYr5IYBdhLWcg3w8-kz - SomeWittyUsername
C++自从开始就有这个规则,在C++98中写道:8.5p13:*"如果T是标量类型,则形式为T x = { a };的声明等效于T x = a;"* - ouah
但是为什么要允许这样的事情呢?我看不到任何好处,只有模棱两可。 - SomeWittyUsername
@icepack 或许可以将一个已存在的(C89之前的)实践编码化。 - ouah

3
这里没有进行任何转换,这是变量初始化的标准定义方式。
8.5.4列表初始化 [dcl.init.list]
1 列表初始化是从大括号初始化列表中初始化对象或引用。这样的初始化器称为初始化列表,列表中逗号分隔的初始化子句称为初始化列表的元素。初始化列表可以为空。列表初始化可以出现在直接初始化或复制初始化上下文中;在直接初始化上下文中发生的列表初始化称为直接列表初始化,在复制初始化上下文中发生的列表初始化称为复制列表初始化。[注意:列表初始化可用于
- 在变量定义中作为初始化器(8.5) …… [示例: int a = {1};

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