在for循环中声明和初始化变量

10

我能简单地写代码吗?

for (int i = 0; ...

替代

int i;
for (i = 0; ...

在C或C++中?

(而且变量i只能在循环内部可访问吗?)


6
尝试一下可能需要的努力比发这个问题要少。 - Dónal
5
@Don:如果你使用一个老旧的、不符合标准的编译器(像某些人似乎仍在使用的那种),它会给出错误的答案。比起相信你特定的编译器的行为,问一下或查看标准更好。 - Mike Seymour
7个回答

20

这在C++中是合法的。

在原始版本的C语言中它是不合法的。
但在C99中被采用为C的一部分(当时一些C++特性被回传到C语言中)
使用gcc编译器

gcc -std=c99 <file>.c
变量在for循环语句内以及被循环的语句中是有效的。如果这是一个块语句,则变量在整个块中都有效。
for(int loop = 0; loop < 10; ++loop)
{
    // loop valid in here aswell
}

// loop NOT valid here.

18

是的,在C++和C99中都是合法的。


5

在C99或C++中这样做是完全合法的:

for( int i=0; i<max; ++i )
{
    //some code
}

它的 while 等价于:

{
    int i=0
    while( i<max )
    {
        //some code
        ++i;
    }
}

3
for循环和while循环并不完全等价。如果“某些代码”包含一个continue语句,就需要考虑发生了什么。 - jamesdlin
5
我只是在澄清 i 的范围。你可以始终确保在调用 continue 之前有一个 ++i,但除此之外,你提出了一个有效的观点。 - rubenvb

3
实际上,在c和c++中,for(int i=0;i<somevalue;i++)一直被视为定义for循环的首选方式。
至于“i”只能在您的循环中访问,您必须小心使用变量名称。如果您在循环之外声明“i”作为变量并将其用于其他用途,则在使用相同变量作为循环计数器时会导致问题。
例如:
int i = 10;
i = 10 + PI;

当你进入 for 循环并声明 i=0 时,这个值会自动更改。


2
是的,可以。但是对于C语言来说,显然你的编译器需要在C99模式下运行。

2

我可以写简单的代码吗?

可以。

(而变量i只能在循环内部访问吗?)

取决于编译器及其版本。据我所知,现代编译器只允许在循环内部访问i。一些旧的编译器也允许在循环外部访问i。一些编译器允许在循环外部访问i,并警告您存在非标准行为。

我认为(但并不确定)在VC98(Visual Studio 6)中使用了“循环外的i”(还有一个全局定义的“i”变量,可能会导致极其有趣的行为)。我认为,在2000年到2003年左右,(微软)编译器开始为外部访问i打印“使用了非标准扩展”,最终这个功能完全消失了。在visual studio 2008中已经不存在该功能。

这可能是按照标准发生的,但我目前无法提供链接或引用。


0
如果您在循环外使用变量,则每次在循环内初始化它时都会更改它。
int i = 0;
for(int e = 0; e < 10; e++)
{
 i = e;
}

现在,i的值每次都会改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接