C 是否可以在循环内定义循环变量';什么是偏执狂?

C 是否可以在循环内定义循环变量';什么是偏执狂?,c,loops,variables,declare,C,Loops,Variables,Declare,我对C很陌生,但对C有很多经验。 我的大学讲师告诉我,在“纯”C中,初始化循环变量是错误的 在论文里。 他说它运行是因为VS编译器。 出于某些原因,演示文稿中的所有材料还显示了循环,其循环变量在论文之外声明 for (int i=0; i < 5; i++) { //He says that this is wrong, and you will lose points in tests for that } int i; for (i=0; i < 5; i++) {

我对C很陌生,但对C有很多经验。 我的大学讲师告诉我,在“纯”C中,初始化循环变量是错误的 在论文里。 他说它运行是因为VS编译器。 出于某些原因,演示文稿中的所有材料还显示了循环,其循环变量在论文之外声明

for (int i=0; i < 5; i++)
{
   //He says that this is wrong, and you will lose points in tests for that
}

int i;
for (i=0; i < 5; i++)
{
   //Says it should be done like that (i declared outside loop)
}
for(int i=0;i<5;i++)
{
//他说这是错误的,你会因此而在测试中失分
}
int i;
对于(i=0;i<5;i++)
{
//说应该这样做(我声明了外部循环)
}

这真的重要吗?是否有些编译器无法识别它?我会在测试中失分吗?

当使用符合C99或更高标准的现代编译器进行编译时,这两个版本之间没有区别,而不是在括号内定义
I
I
的作用域和生存期仅在相应的循环内

在相应的循环之外,在循环内部使用的
i
不存在。对于另一个循环,不能使用它两次f.e

当您尝试在编译器/编译器版本上编译代码时,这是C99之前的C标准,括号内有
i
的定义,您将得到编译错误,只是因为它尚未引入该语言

这两种技术各有优缺点

如果您想在相对循环之后使用
i
,这是您使用的编译器或编译器版本的原因之一,但这是风格和个人品味的问题

我会在考试中失分吗

好吧,如果他/她明确坚持这一点(即使你使用现代编译器),我也不会试图打扰他/她,只是在相对循环之前声明
I
,一切都很好


有时(如果不常见的话)也禁止使用课堂上没有学到的技巧。这可能是一个吹毛求疵但与之相匹配的例子。

在较新的C版本中这是可以的


但有一个明显的区别
i
具有不同的作用域。

这肯定没有错,但编译器使用哪种C标准是一个问题

如果您的编译器使用C99之前的标准,则初始化循环头中的变量将导致类似这样的错误

$ gcc loop.c 
loop.c: In function ‘main’:
loop.c:5: error: ‘for’ loop initial declaration used outside C99 mode
在后来的标准中,支持它。对于您的代码来说,这两种样式的唯一区别是,如果在循环头中声明了变量,则变量的范围仅限于循环


因此,通过不在循环头中初始化,您可以使代码更易于移植,或者与标准/编译器无关。但我认识的大多数人肯定都使用这两种风格。

这个问题将向你解释一切。TLDR:允许在循环内初始化循环变量,因为C99.C99标准草案n1256:6.8.5.3 for语句[…]如果子句-1是声明,则它声明的任何标识符的范围是声明的其余部分和整个循环,包括其他两个表达式[…]。很长一段时间以来,在符合标准的编译器中,这样做是完全可以的。如果没有信息,第一个循环也可以与其他编译器完美地编译和运行。“我会在考试中失分吗?”这取决于讲师对编码风格的要求有多严格。那么,你应该问你的讲师,不是这样的。学院所说的“纯”C是什么意思?历史的C,而不是一个不断发展的标准?他们的课程材料也应该不断发展,但遗憾的是,在我的学校,一些老教师所上的课与20年前完全相同。即使有了“历史”,它的已知事实和解释也发生了变化。@WeatherVane“他们的课程材料也应该不断发展,但遗憾的是,在我的学校,一些老教师所上的课与20年前完全相同。”-是的,我也知道这一点。这是一种“永远不要碰正在运行的系统”的概念,在It领域工作时会引起争议。但这也是一个成本问题——如果f.e.学习手册的部分与较新的标准相矛盾,就必须重写。尽管如此,任何语言的编程学徒都应该是“最新的”。这种所谓的更新版本已经有20多年的历史了。比1972年该语言问世时更新了很多,但肯定不是新的。有些人仍然抱怨它不是ANSI c。对他们来说,这甚至是新的,还不够成熟:)