![](/img/trans.png)
[英]Is it possible to use __LINE__ in the auto-generated variable name in C?
[英]Is it possible to use a for loop to change a variable name in C?
這是一個通用的問題,因此沒有我要解決的實際代碼。 但是我想知道的是,我可以使用for
循環來更改C中變量的名稱嗎? 例如,如果我有part1
, part2
, part3
, part...
,作為我的變量名; 有沒有一種方法可以將其附加到我的循環計數器,以便每次通過都會遞增? 我玩弄了一些東西,似乎什么也沒有用。
在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
在開始時被評估一次。 表達式B
在每次執行BODY
之前進行求值,並且如果循環語句的取值為0,則循環語句將終止(而不執行BODY
)。表達式C
在每次執行BODY
之后求值。 因此,如果您喜歡寫,則可以:
int a;
int b = /* something */;
int c = /* something */;
for ( a=0; b<5 ; c++ ) { ... }
盡管通常這不是一個好主意。
正確的答案是@ user2682768,它是一個數組。 我不確定您是否意識到這一點,並且出於某種原因有意識地不想使用數組。 您的小經驗不能給我足夠的信息。 如果是這樣,請忍受我。
但是您會認識到part1
, part2
, part3
...和part[1]
, part[2]
, part[3]
之間的結構相似性。 區別在於,數組的下標是變量,可以通過編程方式進行更改,而變量名的下標部分則不能,因為它是在編譯時燒入的。 (使用宏引入了元編譯階段,該階段使您可以在實際編譯源之前以編程方式更改源 ,但這是另一回事。)
因此,讓我們比較一下代碼。 假設您要將一個值的平方存儲在一個名稱為后綴的變量中。 你想做類似的事情
int square1, square2, square3;
int i;
for(i=1; i<=3; i++)
{
square/i/ = i*i; /* /i/ to be replaced by suffix "i".
}
有了數組,就變成了
int square[4];
int i;
for(i=1; i<=3; i++)
{
/* the (value of) i is now used as an index in the array.*/
square[i] = i*i;
}
您以編程方式更改變量名稱的想法意味着所有變量都具有相同的類型(因為它們必須在同一段代碼中工作,例如在我的示例中)。 此要求使其非常適合必須都屬於同一類型的數組元素。 如果限制太嚴格,則需要做一些更奇特的事情,例如使用聯合(但是如何知道給定時刻的含義?幾乎就像您有不同的變量開始一樣),指向無類型存儲或C ++的void指針與模板。
在C語言中,您不能在變量名后附加一個表達式,該表達式可擴展為數字並將其用作后綴,以訪問以相同方式開頭的不同變量。
您可以獲得的最接近的結果是使用switch構造“模擬”此行為,但是嘗試這樣做沒有多大意義。
您要求的內容更適合腳本語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.