3

这是一个通用问题,因此我没有尝试解决实际代码。但我想知道的是,我可以使用for循环来更改 C 中变量的名称吗?例如,如果我有part1, part2, part3, part..., 作为我的变量名;有没有办法将它附加到我的循环计数器,以便每次通过时它都会增加?我玩弄了一些东西,似乎没有任何效果。

4

3 回答 3

3

In C, you can't 'change the name of the loop variable' but your loop variable does not have to be determined at compile time as a single variable.

For instance, there is no reason in C why you can't do this:

int i[10];
int j;

j = /* something */;

for (i[j] = 0 ; i[j] < 123 ; i[j]++)
{
    ...
}

or event supply a pointer

void
somefunc f(int *i)
{
    for (*i = 0; *i<10; *i++)
    {
        ...
    }
}

It's not obvious why you want to do this, which means it's hard to post more useful examples, but here's an example that uses recursion to iterate a definable number of levels deep and pass the innermost function all the counter variables:

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 */
}

Also note that in C, there is really no such thing as a loop variable. In a for statement, the form is:

for ( A ; B ; C ) BODY

Expression A gets evaluated once at the start. Expression B is evaluated prior to each execution of BODY and the loop statement will terminate (and not execute BODY) if it evaluates to 0. Expression C is evaluated after each execution of BODY. So you can if you like write:

int a;
int b = /* something */;
int c = /* something */;
for ( a=0; b<5 ; c++ ) { ... }

though it will not usually be a good idea.

于 2015-03-22T16:06:40.060 回答
2

正如@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 指针与模板。

于 2015-03-22T16:44:51.007 回答
0

在 C 中,您不能将扩展为数字的表达式附加到变量名,并将其用作一种后缀来访问以相同方式开头的不同变量。

您可以获得的最接近的方法是使用 switch 构造“模拟”这种行为,但尝试这样做并没有多大意义。

您要求的更适合脚本语言。

于 2015-03-22T15:50:38.523 回答