有没有人有办法初始化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代码,对解决方案没有限制。 (其他图书馆也没问题)
答案 0 :(得分:36)
这是GCC扩展名:
int a[100] = {[0 ... 99] = 1};
答案 1 :(得分:23)
for (count = 0; count < 30; count++) arr[count] = 1;
一行。 :)
答案 2 :(得分:20)
您说了两行,但您可以使用逗号,
运算符在一行中完成。
for(count = 0; count < 30 ; arr[count] = 1,count++);
答案 3 :(得分:14)
在初始化期间(而不是运行时)执行此操作的唯一合理方法似乎是:
#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
};
答案 4 :(得分:10)
在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);
答案 5 :(得分:8)
带指针的一行!
for (int *p = a; p < (a + 30); p++) *p = 1;
或者,如果您过早地害怕因反复计算(a + 30)
而导致的性能损失:
for (int *p = a + 30 - 1; p >= a; p--) *p = 1;
答案 6 :(得分:2)
对于静态值的初始化,我通常认为输入它是首选,如:
int arr[30] = {1, 1, 1, 1, ...};
在这种情况下,编译器可以(并且通常会)在前导码中吐出优化的初始化。
有时初始化更具动态性,如下例所示:
int arr[30];
int x = fetchSomeValue();
for(int i=0; i<30; i++) arr[i] = x;
在这些情况下,您必须对其进行编码,一般规则是最大限度地提高可读性,而不是最小化输入。此代码将被编写一次并多次读取。