簡體   English   中英

初始化一個整數數組

[英]initializing an array of ints

有沒有人可以將int數組(任何多字節類型確實很好)初始化為簡單的非零和非-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;

在這些情況下,您必須對其進行編碼,並且一般規則是最大化可讀性,而不是最小化鍵入。 該代碼將被編寫一次,並被多次讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM