这是一个通用的问题,因此我没有尝试进行故障排除的实际代码。但我想知道的是,我可以使用for
循环来更改C中变量的名称吗?例如,如果我有part1
,part2
,part3
,part...
作为我的变量名称;有没有办法将它附加到我的循环计数器,以便它会随着每次传递而增加?我玩弄了一些东西,似乎没什么用。
答案 0 :(得分: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
在开始时被评估一次。在每次执行B
之前计算表达式BODY
,如果计算结果为0,则循环语句将终止(并且不执行BODY
)。表达式C
在每次执行之后进行评估执行BODY
。如果你喜欢写的话,你可以这样做:
int a;
int b = /* something */;
int c = /* something */;
for ( a=0; b<5 ; c++ ) { ... }
虽然通常不是一个好主意。
答案 1 :(得分:2)
正如@ user2682768正确评论的那样,答案是一个数组。我不确定你是否意识到这一点,并且有意识地不想出于某种原因使用阵列;你的小经验并没有给我足够的信息。如果是这样,请耐心等待。
但您会认识到part1
,part2
,part3
...和part[1]
,part[2]
,{{1}之间的结构相似性}}。不同之处在于数组的下标是可变的并且可以通过编程方式进行更改,而变量 name 的下标部分则不能,因为它在编译时被烧毁。 (使用宏引入了一个元编译阶段,它允许您在实际编译之前以编程方式更改源,但这是另一回事。)
所以让我们比较一下代码。假设您要将值的平方存储在名称值为后缀的变量中。你想做点什么
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".
}
您以编程方式更改变量名称的想法意味着所有变量都具有相同的类型(因为它们必须在同一段代码中工作,就像在我的示例中一样)。这一要求使它们非常适用于所有必须属于同一类型的阵列元素。如果限制太多,你需要做一些比较漂亮的事情,比如使用工会(但是你怎么知道在任何特定时刻它里面有什么?它几乎就像你开始时有不同的变量一样) ,void指向无类型存储的指针或带有模板的C ++。
答案 2 :(得分:0)
在C中你不能在变量名后附加一个扩展为数字的表达式,并将其用作一种后缀来访问以相同方式开始的不同变量。
你可以得到的最接近的是使用switch结构“模拟”这种行为,但尝试这样做是没有意义的。
您要求的内容更适合脚本语言。