1

我想使用 for 命令生成一些变量。看下面的代码:

for (char ch='a'; ch<='z'; ch++)
      int ch=0;

这只是一个例子,在运行上面的代码之后,我想要 int a, int b, int c ...

另一个例子:

for (int i=0; i<10; i++)
      int NewiEnd=0;

例如,运行上面的代码后,我们将有 int New1End、int New2End 等。

希望我足够清楚,我怎么能在 C++ 中做这样的事情?

4

4 回答 4

7

不,不可能,不完全是。但是,这是可能的:

std::map<char,int> vars;    
for (char ch='a'; ch<='z'; ch++)
      vars[ch] = 0;

std::cout << vars['a'] << vars['b'] << vars['c'];

你也可以拥有std::map<std::string, int>.

std::map<std::string,int> vars;
for (int i=0; i<10; i++)
    vars["New" + std::to_string(i) + "End"] = 0;
std::cout << vars["New5End"];
于 2012-11-04T17:25:57.903 回答
4

您尝试做的事情在 C 或 C++ 中是不可能的。

于 2012-11-04T17:23:49.510 回答
4

您似乎想要的是以下类型的地图:

std::map<std::string, int> ints;

这将允许您按名称调用“变量”:

ints["a"] = 0;
ints["myVariable"] = 10;

或如您的示例中所示:

std::map<char, int> ints;
for (char ch='a'; ch<='z'; ch++)
   ints[ch] = 0;

如果您即将使用 'a' - 'z' 您可以使用整数数组:

int ints['z' + 1];
ints['a'] = 0;
ints['z'] = 0;

但这会为 'a' 下面的 ascii 字符分配不必要的空间。

于 2012-11-04T17:26:11.103 回答
2

在 C/C++ 中,当代码编译和运行时,变量名已经“消失”了。您不能在运行时通过“反射”打印出现有变量的名称......更不用说创建新的命名变量了。寻找此功能的人发现,您可以做到这一点的唯一通用方法归结为使用预处理器:

在 C++ 中打印出变量名的通用方法

理论上,预处理器也可以应用于您的问题,但有一定的限制:

在 C 预处理器中编写一个 while 循环

但是任何阅读您的代码的人都可能会在您的心中打下赌注,并且这样做是有道理的。星期天早上的懒惰和坚信这不是你(应该)想要的东西,都让我不想写一个有效的例子。:-)

(对于好奇的,预处理器不是图灵完备的,虽然有一些“有趣”的实验

C/C++ 的本质是让您根据需要构建命名表。默认情况下提供此功能的语言会让您为名称的运行时跟踪付费,无论您是否最终使用反射,这不符合这种特定编译语言的精神。其他人给你的答案更正确。

于 2012-11-04T17:48:43.700 回答