C ++ 배열 초기화


80

배열을 모두 0으로 초기화하는이 형식입니다.

char myarray[ARRAY_SIZE] = {0} 모든 컴파일러에서 지원합니까? ,

그렇다면 다른 유형과 유사한 구문이 있습니까? 예를 들면

bool myBoolArray[ARRAY_SIZE] = {false} 

나는 좋은 돈 false0(그렇지 않으면 if(false)거짓으로 평가되지 않을 것임)과 같으므로 당신이 가진 것은 아마도 99 %의 컴파일러에서 작동 할 것이라고 확신합니다. 표준을 인용하기 전까지는 다른 1 %에 대해 확신 할 수 없습니다.
Chris Lutz

나는 C에서, 알고 int a[10] = { 1, 2, 3 };설정합니다 a[3]..a[9]하기 위해 0, ( "암시 적으로 초기화 정적 저장 기간이 객체와 같은"). C ++에서도 마찬가지입니까?
Alok Singhal

5
네, 그렇습니다. 그것은 C에 대한 진정한 보유하지 않은 경우 ++ 다음 C ++ C. 심지어 원격으로 호환되지 않을 것
크리스 루츠

2
false동일하지 않습니다 0, 그러나에 {0}0으로 변환됩니다 false, 그리고 (C ++의 경우)에 {}당신도 변환에 대해 걱정하지 않아도 : 그것은 초기화 것 false또는 0널 포인터 나 다른 유형에 맞는 기본 또는.
Johannes Schaub-litb

답변:


139

예,이 초기화 형식은 모든 C ++ 컴파일러에서 지원됩니다. C ++ 언어의 일부입니다. 사실, 그것은 C 언어에서 C ++로 온 관용구입니다. C 언어에서는 = { 0 }관용적 범용 제로 이니셜 라이저 입니다. 이것은 C ++ 에서도 거의 마찬가지입니다.

이 초기화는 보편적이기 때문에 bool배열에 대해 다른 "구문"이 실제로 필요하지 않습니다. 유형에 0대한 이니셜 라이저로도 작동 bool하므로

bool myBoolArray[ARRAY_SIZE] = { 0 };

로 전체 배열을 초기화하도록 보장됩니다 false. 만큼 잘

char* myPtrArray[ARRAY_SIZE] = { 0 };

in 유형의 null 포인터로 전체 배열을 초기화하도록 보장합니다 char *.

가독성이 향상되었다고 생각되면 확실히 사용할 수 있습니다.

bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };

하지만 요점은 = { 0 }변형이 정확히 동일한 결과를 제공 한다는 것입니다.

그러나 C ++ = { 0 }에서는 enum 형식과 같이 정수로 초기화 할 수없는 모든 형식에 대해 작동하지 않을 수 있습니다 0. 그러나 C ++는 더 짧은 형식을 지원합니다.

T myArray[ARRAY_SIZE] = {};

즉, {}. 이렇게하면 모든 유형의 배열이 기본 초기화됩니다 (요소가 기본 초기화를 허용한다고 가정). 즉, 기본 (스칼라) 유형의 경우 전체 배열이 제대로 0으로 초기화됩니다.


8
그리고 C ++ 0x에서는 이와 같은 것을 초기화 할 수 있습니다
jk.

4
내 컴파일러 (qt 작성자 2.4.1-qt 버전 4.8.0) bool myBoolArray[ARRAY_SIZE] = { false };에서 배열을 작성 하면 모두 false로 초기화되지만 bool myBoolArray[ARRAY_SIZE] = { true };첫 번째 요소 만 작성 하면 true로 설정되고 나머지는 모두 false로 설정됩니다. 설명이 있습니까?
Rookie coder

@rookie coder : 정확히 무엇에 대한 설명? 어떤 일이 일어날 것으로 예상합니까? C ++에서 배열 을 부분적으로 초기화 bool하면 나머지는 0으로 초기화됩니다. 그것이 바로 그 방법입니다.
AnT 2014-06-30

1
@AndreyT 괜찮지 만,이 동작은 적어도 직관에 반합니다. 와 같이 초기화하지 않으면 bool myBoolArray[ARRAY_SIZE];배열에 임의의 값이 올바로 포함되어 있으므로 초기화가 다른 값을 가진 배열을 반환 할 수 있다고 예상하지 못했을 것입니다. 그게 다야.
신인 코더

1
@AndreyT : 물론입니다.하지만 눈사태가 첫 번째 요소와 다를 것이라고 생각한 적이 없었습니다. ;-) 어쨌든, 정보 감사합니다!
신인 코더

18

'='는 C ++ 11 범용 초기화 구문에서 선택 사항이며 일반적으로 작성하는 것이 더 나은 스타일로 간주됩니다.

char myarray[ARRAY_SIZE] {0}

0

예, 작동해야한다고 생각하며 다른 데이터 유형에도 적용 할 수 있습니다.

그러나 클래스 배열의 경우 이니셜 라이저 목록에있는 항목이 배열의 요소보다 적 으면 나머지 요소에 대해 기본 생성자가 사용됩니다. 클래스에 대해 기본 생성자가 정의되지 않은 경우 이니셜 라이저 목록이 완전해야합니다. 즉, 배열의 각 요소에 대해 하나의 이니셜 라이저가 있어야합니다.


-1

이러한 유형의 방법으로 C ++에서 배열을 선언 할 수 있습니다. 배열 크기를 알고 있다면 다음과 같이 배열을 선언해야합니다. integer : int myArray[array_size]; Double : double myArray[array_size]; Char and string : char myStringArray[array_size]; char와 string의 차이점은 다음과 같습니다.

char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";

배열의 크기를 모르는 경우 다음과 같이 배열을 비워 두어야합니다.

정수: int myArray[array_size];

더블: double myArray[array_size];

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.