35

有没有人有办法简单地将 s 数组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 代码,解决方案就没有限制。(其他库都很好)

4

7 回答 7

39

这是一个 GCC 扩展:

int a[100] = {[0 ... 99] = 1};
于 2012-11-20T16:25:53.597 回答
25
for (count = 0; count < 30; count++) arr[count] = 1;

一条线。:)

于 2012-11-20T16:13:30.873 回答
22

你说了一些关于 2 行的内容,但你可以使用逗号运算符在一行中完成,

for(count = 0; count < 30 ; arr[count] = 1,count++);
于 2012-11-20T16:13:16.680 回答
19

在初始化期间(而不是运行时)执行此操作的唯一明智方法似乎是:

#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
};
于 2012-11-21T07:51:17.037 回答
12

在 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);
于 2012-11-20T16:35:28.100 回答
9

一行有指针!

for (int *p = a; p < (a + 30); p++) *p = 1;

或者,如果您过早地担心重复计算会导致性能下降(a + 30)

for (int *p = a + 30 - 1; p >= a; p--) *p = 1;
于 2012-11-20T17:07:39.560 回答
2

对于静态值的初始化,我通常认为将其输入为首选,如下所示:

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

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

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

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

在这些情况下,您必须对其进行编码,一般规则是最大限度地提高可读性,而不是尽量减少输入。此代码将被编写一次并读取多次。

于 2012-11-20T22:33:20.933 回答