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

25
for (count = 0; count < 30; count++) arr[count] = 1;

一行。:)

于 2012-11-20T16:13:30.873 に答える
22

あなたは2行について何か言いましたが、コンマ,演算子を使用して1行で実行できます。

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

ポインター付きの1行!

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;

このような場合はコーディングする必要があり、一般的なルールは、入力を最小限に抑えるのではなく、読みやすさを最大限にすることです。このコードは 1 回書き込まれ、何度も読み取られます。

于 2012-11-20T22:33:20.933 に答える