int 배열 초기화
누가 배열을 초기화할 수 있는 방법이 있습니까?int
s(어떤 멀티바이트 유형이든 정말 괜찮습니다), 단순히 0이 아닌 값과 1이 아닌 값으로?즉, 각 요소를 개별적으로 수행할 필요 없이 하나의 라이너에서 이 작업을 수행할 수 있는 방법이 있습니까?
int arr[30] = {1, 1, 1, 1, ...}; // that works, but takes too long to type
int arr[30] = {1}; // nope, that gives 1, 0, 0, 0, ...
int arr[30];
memset(arr, 1, sizeof(arr)); // That doesn't work correctly for arrays with multi-byte
// types such as int
참고로, 사용하기memset()
정적 어레이에서 이와 같은 방식으로 다음을 제공합니다.
arr[0] = 0x01010101
arr[1] = 0x01010101
arr[2] = 0x01010101
다른 옵션:
for(count = 0; count < 30; count++)
arr[count] = 1; // Yup, that does it, but it's two lines.
다른 생각 있으신 분?C 코드라면 해결책에 제한이 없습니다.(다른 입술도 괜찮습니다)
이것은 GCC 확장입니다.
int a[100] = {[0 ... 99] = 1};
for (count = 0; count < 30; count++) arr[count] = 1;
한 줄.:)
2줄이라고 하셨는데 쉼표로 한 줄로 할 수 있습니다.,
교환입니다.
for(count = 0; count < 30 ; arr[count] = 1,count++);
런타임이 아닌 초기화 중에 이 작업을 수행할 수 있는 유일한 합리적인 방법은 다음과 같습니다.
#define ONE1 1
#define FIVE1 ONE1, ONE1, ONE1, ONE1, ONE1
#define TEN1 FIVE1, FIVE1
#define TWENTY1 TEN1, TEN1
#define FIFTY1 TWENTY1, TWENTY1, TEN1
#define HUNDRED1 FIFTY1, FIFTY1
int array [100][4] =
{
HUNDRED1,
HUNDRED1,
HUNDRED1,
HUNDRED1
};
그다음에.#define ONE2 2
등등.당신이 이해합니다.
편집 : 매크로를 이렇게 많이 작성한 이유는 이 솔루션이 얼마나 유연한지 보여주기 위해서였습니다.이 특별한 경우에는 그 모든 것이 필요하지 않습니다.그러나 이와 같은 매크로를 사용하면 모든 종류의 이니셜라이저 목록을 빠르고 유연하게 작성할 수 있습니다.
{
FIFTY1, FIFTY2, // 1,1,1,1... 50 times, then 2,2,2,2... 50 times
TWENTY3, EIGHTY4 // 3,3,3,3... 20 times, then 4,4,4,4... 80 times
... // and so on
};
C에서는 일반적으로 다음과 같은 매크로를 사용하여 자체 "지원 라이브러리"를 개발합니다.
#define SET_ALL(a_, n_, v_)\
do { size_t i, n = (n_); for (i = 0; i < n; ++i) (a_)[i] = (v_); } while(0)
#define SET_ALL_A(a_, v_) SET_ALL(a_, sizeof(a_) / sizeof *(a_), v_)
#define ZERO_ALL(a_, n_) SET_ALL(a_, n_, 0)
#define ZERO_ALL_A(a_) SET_ALL_A(a_, 0)
코드에 사용하는 방법은
int arr[30];
SET_ALL_A(arr, 1);
한 줄에 포인터!
for (int *p = a; p < (a + 30); p++) *p = 1;
또는 반복적인 계산으로 인한 성능 저하가 섣불리 우려되는 경우(a + 30)
:
for (int *p = a + 30 - 1; p >= a; p--) *p = 1;
정적 값에 대한 초기화를 위해 일반적으로 다음과 같이 입력하는 것을 선호합니다.
int arr[30] = {1, 1, 1, 1, ...};
이 경우 컴파일러는 프리앰블 코드에서 최적화된 초기화를 뱉을 수 있습니다.
이 예에서와 같이 초기화가 더 동적인 경우도 있습니다.
int arr[30];
int x = fetchSomeValue();
for(int i=0; i<30; i++) arr[i] = x;
이 경우 코드를 작성해야 하며 일반적인 규칙은 타이핑을 최소화하는 것이 아니라 가독성을 극대화하는 것입니다.이 코드는 한 번 작성되고 여러 번 읽힙니다.
언급URL : https://stackoverflow.com/questions/13477281/initializing-an-array-of-ints
'programing' 카테고리의 다른 글
GCC: 유사한 두 루프 사이의 벡터화 차이 (0) | 2023.09.21 |
---|---|
Mysql select distinct (0) | 2023.09.21 |
Swift: 인덱스에서 문자열 배열 바꾸기 (0) | 2023.09.16 |
모든 인수를 함수로 전달하는 방법(vs. optional only $args) (0) | 2023.09.16 |
우커머스 체크아웃에서 기본값을 설정하는 방법 (0) | 2023.09.16 |