gpt4 book ai didi

c++ - 为什么用 C++ 编写一个带有 2 个循环变量的 for 循环是 'hard'?

转载 作者:IT老高 更新时间:2023-10-28 22:17:41 24 4
gpt4 key购买 nike

Possible Duplicate:
In C++ why can’t I write a for() loop like this: for( int i = 1, double i2 = 0; …

C 开发人员会这样写:

int myIndex;
for (myIndex=0;myIndex<10;++myIndex) ...

C++ 开发人员会写这个来防止循环变量泄漏到循环之外:

for (int myIndex=0;myIndex<10;++myIndex) ...

但是,如果您有 2 个循环变量,则不能再这样做了。以下内容无法编译:

for (int myIndex=0,MyElement *ptr=Pool->First;ptr;++myIndex,ptr=ptr->next) ...

逗号运算符不允许这样定义两个变量,所以我们必须这样写:

int myIndex;
MyElement *ptr;
for (myIndex=0,ptr=Pool->First;ptr;++myIndex,ptr=ptr->next) ...

这破坏了拥有真正的循环局部变量的优势。

一种解决方案可能是将整个结构放在大括号之间,如下所示:

{
int myIndex;
MyElement *ptr;
for (myIndex=0,ptr=Pool->First;ptr;++myIndex,ptr=ptr->next) ...
}

但这一点也不优雅。

在 C++(或 C++0x)中没有更好的方法吗?

最佳答案

您只需要了解第一条语句是一个声明(并且逗号 不是 逗号运算符)。这并不难做到:

for (int i, double d; ...)

其实是这样的:

int i, double d;

因为 for (init cond; expr) 语句 被扩展为:

{
init
while (cond)
{
statement
expr;
}
}

一个技巧是使 init 语句成为结构定义和实例,例如:

for (struct { int myIndex; MyElement* ptr;} data = {0, Pool->First};
data.ptr;
++data.myIndex, data.ptr = data.ptr->next)
{
// blah...
}

变成相同的:

{
struct
{
int myIndex;
MyElement* ptr;
} data = {0, Pool->First};

while (data.ptr)
{
{
// blah...
}
++data.myIndex, data.ptr = data.ptr->next;
}
}

但我觉得这很丑。在实践中,我会像你一样把它分开。如果作用域真的是个问题,它可能不是,把多余的大括号扔在那里。

如果没有一点样板代码,我认为这里没有太多需要改进的地方。

关于c++ - 为什么用 C++ 编写一个带有 2 个循环变量的 for 循环是 'hard'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com