これは一般的な質問なので、トラブルシューティングしようとしている実際のコードはありません。しかし、私が知りたいのは、for
ループを使用して C の変数の名前を変更できるかということです。たとえば、変数名として , , , があるとpart1
しpart2
ますpart3
。part...
通過するたびにインクリメントするように、ループ カウンターにアタッチする方法はありますか? 私はいくつかのことをいじりましたが、何もうまくいかないようでした。
3 に答える
Cでは、 「ループ変数の名前を変更する」ことはできませんが、ループ変数はコンパイル時に単一の変数として決定される必要はありません。
たとえば、C でこれを実行できない理由はありません。
int i[10];
int j;
j = /* something */;
for (i[j] = 0 ; i[j] < 123 ; i[j]++)
{
...
}
またはイベント供給ポインタ
void
somefunc f(int *i)
{
for (*i = 0; *i<10; *i++)
{
...
}
}
なぜこれを行う必要があるのか は明らかではありません。つまり、より有用な例を投稿するのが難しいことを意味しますが、再帰を使用して定義可能なレベル数を繰り返し、最も内側の関数にすべてのカウンター変数を渡す例を次に示します。
void
recurse (int levels, int level, int max, int *counters)
{
if (level < levels)
{
for (counters[level] = 0;
counters[level] < max;
counters[level]++)
{
recurse (levels, level+1, max, counters);
}
return;
}
/* compute something using counters[0] .. counters[levels-1] */
/* each of which will have a value 0 .. max */
}
また、C では、ループ変数のようなものは実際には存在しないことに注意してください。for
ステートメントでは、フォームは次のとおりです。
for ( A ; B ; C ) BODY
式A
は最初に 1 回評価されます。ExpressionB
は の各実行の前に評価されBODY
、ループ ステートメントは、BODY
評価が 0 になると終了します ( は実行されません)。 ExpressionC
は、 の各実行後に評価されBODY
ます。だから、あなたが好きなら書くことができます:
int a;
int b = /* something */;
int c = /* something */;
for ( a=0; b<5 ; c++ ) { ... }
ただし、通常は良い考えではありません。
C では、数値に展開される式を変数名に追加し、それを一種のサフィックスとして使用して、同じ方法で始まるさまざまな変数にアクセスすることはできません。
あなたが得ることができる最も近いのは、switch構造を使用してこの動作を「エミュレート」することですが、これを試みるポイントはあまりありません.
あなたが求めたものは、スクリプト言語により適しています。