用C语言声明变量-有多种方法?

用C语言声明变量-有多种方法?,c,C,我正在和一个朋友讨论在C中声明一些变量的正确方法是什么,确切地说是在for循环中 他有一个我不记得的编译器,我有Dev-C++ 他确实: for (int i = 0; i<10; i++) // ... and it works 我有: 如果我像他那样做,Dev-C++会给我一个错误。技术上正确的方法是什么?我被教导要这样做,但现在我很困惑,因为他用另一种方式来做,它对他来说是有效的: < P>在Calb中声明变量,就像你的朋友一样,在C99和C++中得到支持。你的朋友很可能来自C++

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

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

他确实:

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


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

< P>在Calb中声明变量,就像你的朋友一样,在C99和C++中得到支持。你的朋友很可能来自C++背景,这种声明风格是标准的。在循环之外声明循环变量(就像您所做的那样)在旧的C语言中是正确的,例如C89,这显然是您的编译器所支持的


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

取决于您使用的是哪个版本的C。ANSI C原件、里奇和KNNIGIN只支持在块开始时的声明,而现代C和C++的任何味道都允许混合语句和声明。
{ 
   int a;
   printf ("Stuff);
   int b; /* not allowed */
}

在for循环头中声明值会在c99之前的任何编译器中导致错误。如果您使用c99标准或更新版本编译此文件,它将正常工作。

正式地说,这两者之间的物理区别在于性能。将定义放在for后面的括号内,因为for可能有更多机会成为仅寄存器变量。但另一方面,在编译器的分析机制的帮助下,还有许多其他因素可以决定优化结果的细节。因此,最终的结果可能没有什么不同,甚至相反。
确实存在一个不同的情况:如果您在“for”之后的括号内定义了一个变量,那么该变量将无法在for循环的外部使用。

这两种情况都可能是正确的。您朋友的方法将i的定义范围限制为for循环,如果您需要,这对于封装是正确的。但并不是所有的C标准版本都支持它。请注意,问题不是混合语句和声明,而是在for子句中声明变量。此外,答案拼错了Kernighan和Ritchie的名字。修正了作者的拼写错误。for循环的内部不被认为是块,因此我的答案是。然而,你是正确的,它不够精确。变量声明的位置将与任何值得使用的优化编译器完全无关。
{ 
   int a;
   printf ("Stuff);
   int b; /* not allowed */
}