0

我正在和朋友讨论在 C 中声明一些变量的正确方法是什么,确切地说是在 for 循环中。

他有一个我不记得的编译器,而我有 Dev-C++。

他是这样的:

for (int i = 0; i<10; i++)
// ... and it works

我愿意:

int i;
for (i = 0; i<10; i++)
// ... and it works

如果我像他那样做,Dev-C++ 会给我一个错误。技术上正确的方法是什么?我被教导要按照我的方式做,但现在我很困惑,因为他以另一种方式做,而且对他有用 D:

4

4 回答 4

8

C99 和 C++ 支持像您的朋友一样在循环中声明变量。您的朋友很可能来自 C++ 背景,在这种情况下,这种声明风格是常态。像您一样在循环外部声明循环变量在较旧的 C 中是正确的,例如 C89,这是您的编译器显然支持的。

如果您可以访问 C99 编译器,那么选择哪种风格主要是一个偏好问题。经验丰富的 C 程序员不介意在循环体外部声明变量,但在内部声明它们被认为稍微干净一些,因为它将变量的范围限制在尽可能少的词法区域。当然,如果您打算在循环完成后使用它,那么在循环体之外声明变量是必要的——例如,检查循环进行了多远。

于 2013-11-06T20:40:28.377 回答
1

取决于您使用的 C 版本。Ansi C (original, Ritchie & Kernighan) 仅支持在块开始时声明,而现代 C (和任何风格的 C++) 允许混合声明和声明。

{ 
   int a;
   printf ("Stuff);
   int b; /* not allowed */
}
于 2013-11-06T20:44:11.213 回答
0

在 for 循环头中声明一个值会导致 c99 之前的任何编译器出错。如果您使用 c99 标准或更新的标准编译它,它会工作得很好。

于 2013-11-06T20:45:43.427 回答
-2

从形式上讲,这两者之间的物理差异是性能。将定义放在 for 之后的括号内可能有更多机会成为仅限寄存器的变量。但另一方面,借助编译器的分析机制,还有许多其他因素可以决定优化结果的细节。所以最终的结果可能没有什么不同,甚至相反。确实存在不同:如果您在“for”之后的括号内定义了一个变量,则该变量将无法在该 for 循环的外部使用。

于 2013-11-06T20:50:14.960 回答