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循环初始化变量范围的主要内容,如果未能解决你的问题,请参考以下文章

C#中的for循环语句的使用

c#笔记——循环结构

Java——循环应用

c#或java如何用循环定义多个变量

第二天C#学习

c#基础语句——循环语句(forwhileforeach)