【问题标题】:Is it allowed to initialize array recursively? [duplicate]是否允许递归初始化数组? [复制]
【发布时间】:2018-08-13 09:05:56
【问题描述】:

我有以下代码sn-p:

int i[] = {42, i[0]};

是否允许这样的初始化或导致未定义的行为?

三个主要编译器(gcc、clang、msvc)给我42 for i[1]。因此看起来是合法的,但我希望看到这个案例的标准引用。

【问题讨论】:

  • 它在 C 中是合法的。数组成员从头开始初始化。所以你甚至可以:int i[] = { [1] = func(i[0]), [0] = 5 };
  • 在这个论坛上找到了一些技巧。在这种情况下,不需要对数组本身的引用,您也可以使用单个值 42 初始化整个数组,请参阅stackoverflow.com/questions/629017/…
  • @Goodies you could also initialize the whole array using a single value 42 你介意展示一下方法吗?
  • 阅读我链接的主题。这是有效的 C++ 语法:char array[100] = {42}; (请注意,您必须在声明中指定数组长度。)
  • @Goodies 在这种情况下,所有其余元素都将为零。

标签: c++ language-lawyer array-initialization


【解决方案1】:

是的,定义明确。

int i[] = {42, i[0]};

这是一个聚合1初始化2。聚合初始化遵守此规则:

[dcl.init.aggr]/6

聚合元素的初始化按元素顺序进行评估。也就是说,与给定元素相关的所有值计算和副作用都按顺序排列在其后面的任何元素之前。


1)http://eel.is/c++draft/dcl.init.aggr#1

2)http://eel.is/c++draft/dcl.init.aggr#3

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2020-09-18
    相关资源
    最近更新 更多