是否可以使用for循环来更改C中的变量名?

这是一个通用的问题,因此我没有尝试进行故障排除的实际代码。 但我想知道的是,我可以使用for循环来更改C中变量的名称吗? 例如,如果我有part1part2part3part... ,作为我的变量名; 有没有办法将它附加到我的循环计数器,以便它会随着每次传递而递增? 我玩弄了一些东西,似乎没什么用。

在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在开始时被评估一次。 在每次执行BODY之前评估表达式B如果计算结果为0,则循环语句将终止(并且不执行BODY )。在每次执行BODY之后评估表达式C 如果你喜欢写,你可以这样写:

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

虽然通常不是一个好主意。

正如@ user2682768正确评论的那样,答案是一个数组。 我不确定你是否意识到这一点,并且有意识地不想出于某种原因使用arrays; 你的小经验并没有给我足够的信息。 如果是这样,请耐心等待。

但是你会认识到part1part2part3 ……和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; } 

您以编程方式更改变量名称的想法意味着所有变量都具有相同的类型(因为它们必须在同一段代码中工作,就像在我的示例中一样)。 这一要求使它们非常适用于所有必须属于同一类型的arrays元素。 如果限制太多,你需要做一些更好的事情,比如使用联合(但是你怎么知道在任何特定的时刻它里面有什么?这几乎就像你开始使用不同的变量一样),无效指向无类型存储或C ++的指针与模板。

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

你可以得到的最接近的是使用switch结构“模拟”这种行为,但尝试这样做并不是很重要。

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