【问题标题】:Is it possible to use a for loop to change a variable name in C?是否可以使用 for 循环来更改 C 中的变量名?
【发布时间】:2015-05-25 14:18:59
【问题描述】:

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

【问题讨论】:

  • 不能用数组代替吗?
  • 由于这高度依赖于您使用的语言,请添加适当的标签。
  • @JScarry 就像有些人希望你忘记它一样,C 确实拥有一个能够做到这一点的宏系统,尽管它不值得添加作为答案,因为它会导致更多的混乱而不是好处。
  • 像 Lisp 或 Rebol 这样的Homoiconic 语言可以在“自动化编程过程本身”方面做各种各样的事情(而不是像 JavaScript 这样的“宏”或基于字符串的“eval” )。如果您对编写通过迭代自发生成代码并运行它的代码感到好奇……那么一定要调查那些东西!这不是一个坏问题,只是 C 是一头不同的野兽,有着不同的历史和应用领域……试图以这种方式弯曲它通常是一种滥用。
  • 也许您可以尝试更好地解释您想要做什么。正如您可以在下面我的帖子中看到的那样,您的帖子不清楚。更好的问题 -> 更好的答案。例如,发布您玩弄的内容以及遇到的错误。这可能解释了你正在尝试什么。

标签: c variables for-loop loop-counter


【解决方案1】:

在 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++ ) { ... }

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

【讨论】:

    【解决方案2】:

    正如@user2682768 正确指出的那样,答案是一个数组。我不确定您是否意识到这一点并且出于某种原因有意识地不想使用数组;你的小经历没有给我足够的信息。如果是这样,请多多包涵。

    但是您会发现part1part2part3... 和part[1]part[2]part[3] 之间的结构相似性。不同之处在于数组的下标是可变的,可以通过编程方式更改,而变量name的下标部分则不能,因为它是在编译时烧录的。 (使用宏引入了一个元编译阶段,它允许您在实际编译之前以编程方式更改 源代码,但这是另一回事。)

    让我们比较一下代码。假设您要将值的平方存储在名称以该值作为后缀的变量中。你想做类似的事情

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

    【讨论】:

    • 我认为OP想给循环变量加后缀,而不是给循环中做的事情加后缀;虽然不是很清楚。
    • @abligh 实际上,我们不知道他想要什么 ;-)。但是“将它[后缀变量]附加到我的循环计数器”似乎向我表明这两者是不同的。
    • 确实没有。我读到这句话的意思是他希望循环计数器本身被某些东西作为后缀(附加),因此我的回答。但我也能看到你的解释,所以+1。
    • @abligh 啊,现在我明白了。是的,也可能。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多