在 C 中的 for 循环中初始化迭代器变量

Hit*_*iri 1 c

如果这可能是一个愚蠢的问题,我很抱歉。上次我朋友跟我说,我for loop在嵌入式系统上开发的时候应该在外面声明迭代器变量,例如:

int i = 0;
for (i = 0; i < 10; i++) {
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

不应该使用如下:

for (int i = 0; i < 10; i++) {
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

我问他为什么,但他只是说“这是小费”。有人可以给我一些解释吗?

我有下面的短代码(一个用于初始化 for 循环内的迭代器变量,一个用于 for 循环外)。你能告诉我什么更好吗?

int i = 0;
for (i = 0; i < 10; i++) {
   // Do something
}

for (i = 0; i < 100,; i++) {
   // Do something
}

// Do something, but don't need to use variable `i`
Run Code Online (Sandbox Code Playgroud)

另一个:

for (int i = 0; i < 10; i++) {
   // Do something
}

for (int i = 0; i < 100,; i++) {
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

我知道,当在 中声明迭代器时for loop,它被限制在for loop. 在两种情况下有什么重要的事情吗?

Jas*_*ent 6

作为一般规则,最佳实践是在for循环中声明变量。它避免了混淆,并为编译器提供了更多优化机会。

在外部作用域中声明的唯一时间是如果您需要再次使用该变量 - 说循环直到达到某个标准,然后从您在另一个循环中停下的地方开始。

从历史上看,这里存在一个问题,即在语言标准化之前,不同的编译器会以不同的方式对待循环迭代器的范围。

在以下代码中i,超出范围的地方会有所不同:

void func(void)
{
    for (int i = 0; i < 10; ++i)
    {
        ...
    } // Some compilers have i going out of scope on the last loop iteration

    int j = i;  // So in some compilers this is valid, others not
} // Other compilers i goes out of scope here
Run Code Online (Sandbox Code Playgroud)

因此,编写更便携:

void func(void)    
{
    int i;

    for (i = 0; i < 10; ++i)
    {
        ...
    } 

    int j = i;  // Valid on all compilers
} //  i goes out of scope here on all compilers
Run Code Online (Sandbox Code Playgroud)

因为尽早声明循环计数器更便于携带。但这在 90 年代被标准化为更紧的范围,所以现在这不是真正的问题。