>백엔드 개발 >C++ >배열을 사용한 C 집계 초기화에서 언제 중괄호를 사용합니까?

배열을 사용한 C 집계 초기화에서 언제 중괄호를 사용합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-07 03:42:11370검색

When to Use Braces in C   Aggregate Initialization with Arrays?

배열이 포함된 집계에 대한 모호한 초기화 구문

C에서 배열이 포함된 집계를 초기화할 때 중괄호를 생략하면 혼란과 오류가 발생할 수 있습니다. 이는 다음 예에서 분명하게 드러납니다.

// Error: Too many initializers
std::array<A, 2> a1 = {
    {0, 0.1},
    {2, 3.4}
};

// Valid
std::array<double, 2> a2 = {0.1, 2.3};

구조의 std::array에 필요한 중괄호

첫 번째 예에서는 std::array가 다음과 같기 때문에 오류가 발생합니다. 집계이며 사용자 정의 생성자가 없습니다. 내부 배열을 초기화하려면 수정된 버전에서 볼 수 있듯이 명시적인 중괄호가 필요합니다.

std::array<A, 2> a1 = {
    {{0, 0.1}, {2, 3.4}}
};

POD의 std::array에는 중괄호가 필요하지 않습니다

반대로, 표준::배열 두 번째 예에서는 double이 POD(Plain Old Datatype)이고 배열 초기화가 기본 초기화 프로그램에 의해 효과적으로 처리되므로 중괄호가 필요하지 않습니다.

집합체의 일관성

집계 멤버에 중괄호를 요구하는 원칙은 다음과 같이 다른 유형의 집계에 적용됩니다. 음:

// Valid
B meow1 = {1, 2};
B bark1 = {{1, 2}};

C meow2 = {1, 2};
C bark2 = {{1, 2}};

D의 모호성

그러나 다음 예는 오류로 이어집니다.

// Error: Too many initializers
D meow3 = {{1, 2}, {3, 4}};
D bark3 = {{{1, 2}, {3, 4}}};

D에서는 초기화 프로그램이 foo 자체가 배열이기 때문입니다. meow3의 중괄호는 foo의 초기화나 내부 배열을 참조할 수 있기 때문에 모호합니다. 모호성을 해결하려면 bark3에서와 같이 명시적인 중괄호가 필요합니다.

집계 초기화 메커니즘

집계 초기화에서 중괄호가 생략되면 몇 가지 규칙이 적용됩니다.

  1. 멤버 집계의 이니셜라이저가 중괄호로 시작하면 다음으로 처리됩니다. 완전 중괄호 초기화 및 중괄호 내의 모든 멤버가 초기화됩니다.
  2. 초기화 프로그램이 중괄호로 시작하지 않으면 목록에서 집계 멤버를 초기화하기에 충분한 이니셜라이저만 가져옵니다. 나머지 초기화 프로그램은 상위 집계의 다음 멤버에 사용됩니다.

추가 예

  • 완전히 보강된 초기화: { {1, 3, 5}, {2, 4, 6}, {3, 5, 7} }
  • 내부 집계에 대해 생략된 중괄호: { 1, 3, 5, 2, 4, 6, 3, 5, 7 }
  • 모호함 구문: { {1, 3, 5}, {2, 4, 6}, 3, 5, 7 } (완전히 괄호가 있거나 괄호가 생략되지 않음)

위 내용은 배열을 사용한 C 집계 초기화에서 언제 중괄호를 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.