programing

이 C는 왜 유효합니까?

goodsources 2022. 7. 26. 23:43
반응형

이 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) "초기화자는 초기화 대상 내에 포함되지 않은 객체에 대해 값을 제공하려고 시도해서는 안 된다."

요소 " " " "10a는 초기화에 포함되지 객체의 하려고 합니다.initializer는 initializer를 사용합니다.

초과 요소는 무시됩니다.6.7.8 Initialization에는 두 가지 부분이 있습니다.첫 번째 단락 17부터:

각 괄호로 둘러싸인 이니셜라이저 목록에는 현재 개체가 관련되어 있습니다.지정이 존재하지 않는 경우 현재 객체의 서브오브젝트는 현재 객체의 유형(첨자순서 증가 배열 요소, 선언순서 구조체 멤버 및 유니언의 첫 번째 명명된 멤버)에 따라 초기화됩니다.

1, 7, 9가 되는 이유를 알 수 있습니다.현재 오브젝트는 이 괄호로 설정됩니다.그럼 왜 엑스트라에는 관심이 없는지에 대해서는 20항부터 설명하겠습니다.

리스트의 이니셜라이저는 서브어그리게이트의 요소 또는 멤버 또는 포함된 유니언의 첫 번째 멤버를 충분히 고려합니다.남은 이니셜라이저는 현재 서브어그리게이트 또는 포함된 유니언의 일부인 다음 요소 또는 애그리게이트의 멤버를 초기화하기 위해 남겨집니다.

언급URL : https://stackoverflow.com/questions/9792162/why-is-this-valid-c

반응형