初始化一个int数组

有没有人有一种方法来初始化一个int数组(任何多字节types是否真的很好),到一个非零和非-1值? 我的意思是,有没有办法在一个class轮中做到这一点,而不必单独做每个元素:

 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 

另一种select:

 for(count = 0; count < 30; count++) arr[count] = 1; // Yup, that does it, but it's two lines. 

任何人有其他的想法? 只要是C代码,解决scheme就没有限制。 (其他库很好)

这是一个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等等。 你明白了。

编辑:我写这么多macros的原因是为了演示这个解决scheme是多么灵活。 对于这个特殊的情况你不需要全部。 但是像这样的macros,你可以快速灵活地编写任何types的初始化列表:

 { 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中,你通常使用macros来开发你自己的“支持库”

 #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; 

对于初始化为静态值,我一般认为input它是首选,如下所示:

 int arr[30] = {1, 1, 1, 1, ...}; 

在这种情况下,编译器可以(并且通常)在前导码中吐出优化的初始化。

有时初始化更加dynamic,如下例所示:

 int arr[30]; int x = fetchSomeValue(); for(int i=0; i<30; i++) arr[i] = x; 

在这些情况下,您必须对其进行编码,一般规则是最大化可读性,而不是最小化键入。 此代码将被写入一次,并阅读大量的时间。