for 循环初始化变量范围在 C++、Java、C# 之间
本文关键字:Java 之间 C++ 循环 初始化 变量 范围 for | 更新日期: 2023-09-27 17:56:00
我在理解这 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 不在它内部的级别上声明的。
尝试运行以下代码来检查我的想法是否正确:
老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
爪哇岛:
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++(在成为ISO标准的1998年ANSI标准之前)的行为与您描述的"旧C++"一样。 大约在1995年,根据记忆,标准草案发生了变化,当时大多数编译器都采用了这一变化。 在此之前,一些C++编译器将变量的范围限制为循环,作为特定于供应商的扩展。
1999 年标准中的 C、标准 C++、Java 和 C# 都将 for 循环中声明的变量范围限制为仅该循环。
1989年(ANSI)和1990年(ISO)的标准C,预标准C(包括K&R)和1995年之前的试标准C++没有。 正如 juanchpanza 在评论中指出的那样,C89/C90 根本不允许在循环初始化中使用变量声明。
实际上,它并不完全适合前标准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 块中。