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++中有所不同。

这是对的

还是不对的??

谢谢

for 循环初始化变量范围在 C++、Java、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 块中。