10

여기서, I는 초기화 한 배열 :지정자가 요소를 엄격하게 증가시킨 후에 요소가 존재합니까? 이런

#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 

, I 선택한 배열 인덱스 7a[7] = 4 A와 후 일부 요소를 추가했다. 그런 다음 색인 7, 89의 배열 요소를 인쇄하고 올바르게 인쇄하십시오.

그래서 인덱스 89의 정확한 출력이 명시 적으로 정의되어 있지 않습니까? 시퀀스가 ​​인덱스 3에서 시작하지 않는 이유는 무엇입니까?

+2

이것은 C99 (및 g90의 C90)에서 허용됩니다. https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html; 또한 http://www.drdobbs.com/the-new-c-declarations-initializations/184401377 –

+0

을 참고하십시오. C++에서는 허용되지 않습니다. 언어가 분기 된 또 다른 지점입니다. – Bathsheba

+1

허용 될 수도 있지만 매우 자주하지 마십시오. (결코 좋을 것 같지 않습니다 :). –

답변

11

왜 시퀀스가 ​​인덱스 3에서 시작하지 않습니까?

그것은 작동하지 않기 때문에 !!

C11, 장 §6.7.9 지정 초기화 (강조 광산)

각 브레이스 둘러싸인 초기화리스트를 인용하는 것은 연관된 현재의 오브젝트를 갖는다. 지정이없는 경우 현재 개체의 하위 개체는 에 따라 현재 개체의 형식, 즉 첨자가 증가하는 배열 요소, 선언 순서가 멤버 인 멤버 및 첫 번째 명명 된 유니온 멤버로 초기화됩니다. 148). 반대로 지정을 지정하면 다음 초기화 기가 지정자에 의해 설명 된 하위 객체 의 초기화를 시작합니다. 다음 초기화는 지정자에 의해 설명 된 다음 서브 오브젝트로 시작하여 의 순서대로 계속 진행됩니다.149)

따라서, 사용자의 경우에는, 부호 [7] 후 브레이스 둘러싸인 목록의 나머지 두 요소 인덱스 89에서 다음 서브 오브젝트의 배열 요소를 초기화한다.

그냥 조금 더 관련 정보를 추가 할 수

, 지정자의 형식은 다음

[ constant-expression ] 

현재 객체 (아래 정의) 배열 유형을하며식이 을한다이있는 경우

정수 상수 표현식. [...]

6

은 명시 적으로 정의하지 않고 정확한 인덱스 (8)의 출력과 9는?

네, 맞습니다.컴파일러는 인덱스 7 뒤에 배열 요소를 초기화합니다.
이니셜 라이저는 처음 세 요소를 1, 23으로 초기화합니다. 인덱스 7의 요소는 4입니다. 인덱스 7 다음의 두 요소는 값이 각각 89입니다.

왜 인덱스가 인덱스 3에서 시작하지 않습니까?

지정된 초기화 프로그램 [7]은 인덱스 7 다음에 배열 요소의 초기화를 계속하도록 컴파일러에 지시합니다.