Подтвердить что ты не робот

Являются ли элементы присутствующими после того, как указатель инициализирует элементы строго возрастающим образом?

Здесь я инициализировал массив следующим образом:

#include <stdio.h>

int main() 
{
    int a[10] = {1, 2, 3, [7] = 4, 8, 9};

    printf("a[7] = %d\na[8] = %d\na[9] = %d\n", a[7], a[8], a[9]);

    return 0;
}

Выход:

a[7] = 4
a[8] = 8
a[9] = 9

Здесь я выбрал индекс массива 7 как a[7] = 4 и после этого добавил некоторые элементы. Затем напечатайте элементы массива индекса 7, 8 и 9 и напечатайте правильно.

Итак, Правильно ли это вывод индекса 8 и 9 без его явного определения? Почему последовательность не начинается с индекса 3?

4b9b3361

Ответ 1

Почему последовательность не начинается с индекса 3?

потому что это не так, как это работает!!

Цитата C11, глава §6.7.9 для назначенного инициализатора (акцент мой)

Каждый список инициализаторов, заключенный в фигурные скобки, имеет связанный с ним текущий объект. Когда нет обозначений, субобъекты текущего объекта инициализируются в порядке к типу текущего объекта: элементы массива в возрастающем порядке подстроки, структура членов в порядке декларации и первого имени члена союза. 148). Напротив, назначение приводит к тому, что следующий инициализатор начнет инициализацию подобъекта описываемый обозначением. Инициализация продолжается по порядку, начиная с последующим подобъектом после того, как описывается обозначением. 149)

Таким образом, в вашем случае после указателя [7] оставшиеся два элемента в закрытом списке скобок будут использоваться для инициализации следующих под-объектов, элементов массива в индексе 8 и 9.

Просто добавьте немного более актуальную информацию,

Если обозначение имеет вид

[ constant-expression ]

то текущий объект (определенный ниже) должен иметь тип массива, и выражение должно быть целочисленное постоянное выражение. [...]

Ответ 2

Правильно ли он выводит индексы 8 и 9 без явного определения?

Да, это правильно. Компилятор будет инициализировать элементы массива после индекса 7.
Инициализатор инициализирует первые три элемента 1, 2 и 3. Элемент с индексом 7 будет иметь значение 4. Два элемента после индекса 7 будут иметь значения 8 и 9 соответственно.

Почему последовательность не начинается с индекса 3?

Обозначенный инициализатор [7] сообщает компилятору продолжить инициализацию элементов массива после индекса 7.