【问题标题】:Is it the correct way to initialize array? [duplicate]这是初始化数组的正确方法吗? [复制]
【发布时间】:2023-03-09 16:39:01
【问题描述】:

这是一种不太常见的初始化数组的方法:

 int a[3] = {[2] 5, [0] 10, [1] 15};

在程序中使用了这个数组,

#include <stdio.h>

int main() {
    //code
    int a[3] = {[2] 5, [0] 10, [1] 15};
    printf("a[0] = %d  a[1] = %d   a[2] = %d\n", a[0], a[1], a[2]);
    return 0;
}

输出:

a[0] = 10  a[1] = 15   a[2] = 5

在线编译器链接: http://code.geeksforgeeks.org/4onQAI

所以,我有一个问题:

初始化数组的方法正确吗?

【问题讨论】:

  • printf("%d\n",,a[2]); 编译了吗?
  • 不,这不是初始化数组的正确方法。这不是有效的 C++。
  • C 和 C++ 不一样
  • ICC 接受它,因为 GCC 接受它。但这并不正确。
  • 很清楚OP在问什么。投票决定重新开放。

标签: c arrays


【解决方案1】:

关闭。正确的做法如下:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};

这是一个指定初始化器,它允许您初始化指定的元素。任何未指定的元素都设置为 0。

这是在C standard 的第 6.7.9 节中指定的。

您展示的语法是一些编译器支持的非标准扩展,特别是 GCC。如果您使用-pedantic 进行编译,您会收到以下警告:

警告:过时使用不带“=”的指定初始化程序

【讨论】:

  • C99 不是“C 标准”。那是带有草案 n1570 的 C11。请参阅foreword
  • @Olaf 更新了指向 C11 文档的链接。
  • 感谢您的回答...
【解决方案2】:

您的代码 sn-p 对该指定的初始化程序使用过时的语法:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};

自 GCC 2.5 以来已过时但 GCC 仍然接受的另一种语法是在元素值之前写“[index]”,不带“=”。 (reference)

省略= 不标准,不应用于新开发。

【讨论】:

  • no in上面的问题初始化数组不同。
  • @NectarM 这就是引用部分所说的:“在元素值之前写'[index]',没有'='”
  • 我们为什么以及在哪里使用这种类型的初始化?
  • @NectarM 如果您的意思是旧语法,我们不应该再使用它。至于新的,它可以简化稀疏数组的初始化。
【解决方案3】:

指定初始化器的正确使用方式是

int a[3] = {[2] = 5, [0] = 10, [1] = 15};  

[index] 和 C 标准中的值之间应该有 =
您初始化的方式可能是一些扩展。

初始化语法(C11-§6.7.9)

初始化器: 赋值表达式 {初始化列表} {初始化列表,} 初始化列表: designationopt 初始化器 初始化器列表,指定opt初始化器 指定: 指示符列表 = 指示符列表: 代号 指示符列表指示符 代号: [常量表达式] .标识符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多