c++、java、C#之间的for循环初始化变量范围
Posted
技术标签:
【中文标题】c++、java、C#之间的for循环初始化变量范围【英文标题】:for loop init variable scope between c++, java, C# 【发布时间】:2015-06-12 21:15:03 【问题描述】:我在理解这 4 种语言 C、C++、C#、Java 中 for 循环的初始变量范围的差异时遇到了问题
我所知道的是,在 C# 中:for ( int i = 1; i<=5; i++)
在这里,i
是一个局部变量,不会出现在 for 括号的范围之外。所以我可以在多个块中多次使用它,Java也是这样,但我知道c和c ++与for ( int i = 1; i<=5; i++)
中的i
不同是在for not in inside的级别上声明的。
我尝试运行以下代码来检查我的想法是否正确:
老C:
// old C: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
// note: previous definition of 'i' was here
for ( int i = 0; i<=5; i++) printf ("%d",i);
for ( int i = 5; i>=0; i--) printf ("%d",i);
printf ("%d",i);
C99:
// error: 'i' undeclared (first use in this function)
for ( int i = 0; i<=5; i++) printf ("%d",i);
for ( int i = 5; i>=0; i--) printf ("%d",i);
printf ("%d",i);
旧 C++:
// error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
for ( int i = 0; i<=5; i++) cout << i << endl;
for( int i = 5; i>=0; i--) cout << i << endl;
cout << i;
C++11:
for ( int i = 0; i<=5; i++) cout << i << endl;
for( int i = 5; i>=0; i--) cout << i << endl;
cout << i; error: 'i' was not declared in this scope
Java:
for ( int i = 0; i<=5; i++) System.out.println(i);
for( int i = 5; i>=0; i--) System.out.println(i);
System.out.println(i); // error: 'i' was not declared in this scope
C#:
for ( int i = 0; i<=5; i++) Console.Write(i); // 0 1 2 3 4 5
Console.WriteLine("");
for ( int i = 5; i>=0; i--) Console.Write(i); // 5 4 3 2 1 0
Console.WriteLine(i); // error: 'i' was not declared in this scope
我认为 C99、C++11、C#、Java 是相同的,而差异仅在旧 C 和 C++ 中。
这对不对??
谢谢
【问题讨论】:
请注意,您的“旧 C++”是准标准的“C++”。自第一个标准以来,这一点没有改变。基本上,所有行为都相同,只是在 C89 中不能在循环范围内声明i
。
好的,谢谢。
@Olaf 我知道在 C89 中我无法在括号内初始化 i,但我的问题是关于范围
@Marzouk:如果你不能在括号内声明它,那么范围是不可能的。在所有其他语言中,范围是完整的 for
语句(即测试和高级表达式,以及循环体。)
@Olaf 我的意思是在 C89 中你不能在循环括号内声明。在这种特殊情况下,这使得范围问题变得毫无意义。
【参考方案1】:
不完全是。
只有预标准 C++(在成为 ISO 标准的 1998 年 ANSI 标准之前)的行为与您对“旧 C++”的描述相同。大约在 1995 年,标准草案在记忆中发生了变化,当时大多数编译器都采用了这种变化。在此之前,一些 C++ 编译器将变量的范围限制为循环作为特定于供应商的扩展。
从 1999 年标准开始的 C、标准 C++、Java 和 C# 都将在 for 循环中声明的变量的范围限制在该循环内。
1989 年 (ANSI) 和 1990 年 (ISO) 中的标准 C、预标准 C(包括 K&R)和 1995 年之前的预标准 C++ 没有。正如 cmets 中 juanchpanza 所指出的,C89/C90 根本不允许在循环初始化中声明变量。
【讨论】:
谢谢,这正是我需要知道的 请注意,C89 不允许像在 OP 代码中那样声明循环初始化的变量。 真的,胡安。我会尽快修改我的帖子以反映这一点。【参考方案2】:实际上,它并不完全适用于标准 C++。因为一些编译器有关于循环变量的问题,i
可以在 for 循环块之外使用而无需重新声明。我是说
// error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
for ( int i = 0; i<=5; i++) cout << i << endl;
for( int i = 5; i>=0; i--) cout << i << endl;
cout << i;
在那个编译器中这可能不是错误。您可能会在要保护的文件中看到此宏。
#define for if(0) else for
之后,i
位于 else 块中。
【讨论】:
重新定义语言关键字,就像在那个宏中一样,在 C 和 C++ 中都给出了未定义的行为。尽管它通常会提供您使用实际编译器/预处理器描述的“保护”,但实际上并不能保证。以上是关于c++、java、C#之间的for循环初始化变量范围的主要内容,如果未能解决你的问题,请参考以下文章