返回

使用范围指定符简化 C 语言中的 Aggregate 初始化

Linux

Aggregate 初始化中的范围指定符

在 C 语言中,aggregate 初始化是一种用于初始化数组或结构体数据的简便方法。它使用大括号 {} 和逗号分隔的值来指定各个元素。当涉及到数组时,aggregate 初始化可以利用一个方便的语法功能:范围指定符 [N ... M]

什么是范围指定符?

范围指定符 [N ... M] 允许您指定要初始化的数组中连续元素的范围。它包含两个整数:

  • N :范围的起始索引(0 索引)
  • M :范围的结束索引(不包含)

例如,范围指定符 [0 ... 4] 表示数组中索引为 0 到 3(不包含)的连续元素的范围。

如何使用范围指定符

在 aggregate 初始化中使用范围指定符非常简单。只需将指定符放在大括号内,后面紧跟要初始化的值。例如:

int arr[] = { [0 ... 4] = 0, 5, 6, 7 };

在这个示例中,范围指定符 [0 ... 4] 确保数组 arr 的前五个元素(索引为 0 到 4)被初始化为 0。数组的剩余元素保持未初始化状态。

省略索引

如果省略起始索引 N 或结束索引 M,则 C 编译器会做出一些假设:

  • 省略 N:默认值为 0。
  • 省略 M:默认值为数组大小减 1。

因此,以下代码与前面的示例等效:

int arr[] = { [ ... 4] = 0, 5, 6, 7 };

示例

让我们看几个使用范围指定符的示例:

// 初始化数组前三个元素
int arr1[] = { [0 ... 2] = 10 };

// 初始化数组最后三个元素
int arr2[] = { [5 ... 8] = 5 };

// 初始化结构体前两个成员
struct point {
    int x;
    int y;
    int z;
};

struct point point1 = { [0 ... 1] = 1 };

注意:

  • 范围指定符只能用于 aggregate 初始化。
  • 起始索引 N 必须小于或等于结束索引 M
  • 如果指定的范围超出数组边界,则会导致未定义行为。

结论

aggregate 初始化中的范围指定符是一种强大的工具,可以简化数组和结构体的初始化过程。通过指定连续元素的范围,您可以更轻松地控制数据初始化的顺序和布局。了解如何正确使用此语法功能对于编写高效和可读的 C 代码至关重要。

常见问题解答

  • 什么是 aggregate 初始化?
    aggregate 初始化是一种用于初始化数组或结构体数据的简便方法。它使用大括号 {} 和逗号分隔的值来指定各个元素。

  • 什么是范围指定符?
    范围指定符 [N ... M] 允许您指定要初始化的数组中连续元素的范围。

  • 如何使用范围指定符?
    只需将指定符放在大括号内,后面紧跟要初始化的值。

  • 可以省略范围指定符中的索引吗?
    可以,如果省略起始索引或结束索引,则编译器会做出一些假设:

    • 省略起始索引:默认为 0。
    • 省略结束索引:默认为数组大小减 1。
  • 范围指定符适用于哪些数据类型?
    范围指定符只能用于 aggregate 初始化,即数组和结构体。