이 C는 왜 유효합니까?
레딧에서 우연히 이 코드를 발견했어요.타입 변환이 무효라고 생각했을 것입니다.
int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 };
스칼라 이니셜라이저의 과도한 요소와 브레이스에 대한 경고가 몇 개 표시됩니다.하지만 지지 of of 의 a
[1, 7, 9]
.
이것이 실제로 정당한 것이며, 만약 그렇다면, 정확히 무슨 일이 일어나고 있는지 누가 설명해 줄 수 있나요?
int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 };
무효입니다.
입니다.int b[1] = {1, 2};
「C99」라고 되어 있기 때문입니다.C99 †
(C99, 6.7.8p1) "초기화자는 초기화 대상 내에 포함되지 않은 객체에 대해 값을 제공하려고 시도해서는 안 된다."
요소 " " " "10
a
는 초기화에 포함되지 객체의 하려고 합니다.initializer는 initializer를 사용합니다.
초과 요소는 무시됩니다.6.7.8 Initialization에는 두 가지 부분이 있습니다.첫 번째 단락 17부터:
각 괄호로 둘러싸인 이니셜라이저 목록에는 현재 개체가 관련되어 있습니다.지정이 존재하지 않는 경우 현재 객체의 서브오브젝트는 현재 객체의 유형(첨자순서 증가 배열 요소, 선언순서 구조체 멤버 및 유니언의 첫 번째 명명된 멤버)에 따라 초기화됩니다.
1, 7, 9가 되는 이유를 알 수 있습니다.현재 오브젝트는 이 괄호로 설정됩니다.그럼 왜 엑스트라에는 관심이 없는지에 대해서는 20항부터 설명하겠습니다.
리스트의 이니셜라이저는 서브어그리게이트의 요소 또는 멤버 또는 포함된 유니언의 첫 번째 멤버를 충분히 고려합니다.남은 이니셜라이저는 현재 서브어그리게이트 또는 포함된 유니언의 일부인 다음 요소 또는 애그리게이트의 멤버를 초기화하기 위해 남겨집니다.
언급URL : https://stackoverflow.com/questions/9792162/why-is-this-valid-c
'programing' 카테고리의 다른 글
Vuex의 상태 초기화 코드를 어디에 넣어야 합니까? (0) | 2022.07.26 |
---|---|
iOS 라이브러리에서 BitCode로 (0) | 2022.07.26 |
Vuex가 클래스 인스턴스에 간섭하지 않도록 하려면 어떻게 해야 합니까? (0) | 2022.07.26 |
printf에서 '%p'은 어디에 유용합니까? (0) | 2022.07.26 |
커스텀 컴포넌트 내에서 Vue.js 플러그인을 사용하는 방법 (0) | 2022.07.26 |