问题如下:
示例一:static void Main(string[] args)
        {
            int i;
            int j;
            for ( i = 0; i <= 10; i++)
            {
                j = 9;
            }
            Console.WriteLine("i的作用域是main?{0}",i);
            Console.WriteLine("j的作用域是main?{0}",j);
            Console.ReadKey();
        }
//此时j值输出错误,怎么理解i和j的声明与初始化?示例二:static void Main(string[] args)
        {
            for (int i = 0; i <= 10; i++)
            {
               // j = 9;
            }
            Console.WriteLine("i是一个全局变量?{0}",i);
           // Console.WriteLine("j是一个全局变量?{0}",j);
            Console.ReadKey();
        }
//此时i的值输出错误,又怎么理解i的声明和初始化呢?

解决方案 »

  1.   

    先说一下自己的理解:
    在示例一中,为了解释j值的错误我把for(i=0;i<=10;i++)(j=9;)
    理解为
    i=0;
    while(i<=10)
    {
       j=9;
       i++;
    }
    这样我就可以理解j值错在未初始化~可示例二却推翻了我的理解~迷惑啊
      

  2.   

    示例二里面的i的作用域是在for循环里面,
      

  3.   

    第一个,你的j无法保证会执行到赋值语句,因为无法保证赋值(编译器才不会去执行你的for语句呢),编译器需要你给个明确的初始。第二个,i这个变量有歧义,是明显禁止的。
      

  4.   

    第一个,j 没有初始化,对于变量,初始化后,才可以使用。第二个,i 仅在for循环中起作用,出了for循环,则失效。
      

  5.   

    说一下我了解的。。第一个:编译器只会默认为全局变量赋值(如果你的j是全局变量的会便没有关系——j定义到Main函数的外面),而i值,在for语句体里面已经赋值了(i=0),所以会报错。第二个:这个我没有发现什么错误,可能是你的错觉吧!平常我们都是通过i值来判断循环体内部的部分,而这儿是直接判断i值了,你可以通过单步调试看到,最后i=11了,只是没有执行for内部的代码而已。
      

  6.   


    你使用什么编译工具?第二段代码可以编译通过?离开了for循环这个语句块,并不存在变量i声明,根本无法知道随后Console.Write中的i是什么!
      

  7.   

    LZ不好意思啊,出来点点意外,:-D其实,这两个例子举的蛮好的,至少我们可以去研究一下,编译器是如何“对待”for语句,在示例一中,编译器等于“识别”了i=0语句,但是示例二中,编译器却没有“识别”int i = 1;请sp1234帮忙解释一下!!!
      

  8.   

    示例一里的i与j的作用域都在整个Main()函数内。
    static void Main(string[] args)
      {
      int i;                //此处i被声明
      int j;                //此处j被声明
      for ( i = 0  ;/* 此处i被初始化为0 */; i <= 10; i++)
                j = 9;      //此处j被在循环内被反复赋值为9
    示例二里的i作用范围仅在循环体内,j未见声明与使用
    static void Main(string[] args)
      {
      for (int i = 0; /* 此处i被声明并初始化为0 */ i <= 10; i++)
      {
      // j = 9;示例二:static void Main(string[] args)
      {
      for (int i = 0; i <= 10; i++)
      {
      // j = 9;
      }
      Console.WriteLine("i是一个全局变量?{0}",i);
      // Console.WriteLine("j是一个全局变量?{0}",j);
      Console.ReadKey();
      }
    //此时i的值输出错误,又怎么理解i的声明和初始化呢?
      

  9.   


    非常楼上各位的解答,这个问题的关键就是在于“编译器是如何对待for语句最开始的i=0(或int i=0)”,谢谢qingyun1029把这个问题提炼出来!也希望有谁能帮我解答清楚啊!
      

  10.   

    TO:abbey   谢谢你的回答!
    那示例一中的i=0;是属于Main函数,还是属于for语句呢?
    示例二中的int i=0呢?
      

  11.   

    void somemethod()
    {
        int i;                                // 这里是行3            
        for (int i =0; i< 5; i++)    // 这是行4
        {
             // 这对大括号里,是行4声明的i的作用域   
        }
    }    // 这对大括号,是行3声明的i的作用域
    暂且不论上面的代码重复定义了2个同样的局部变量i,会引发编译错误,仅作区分二者的作用域。其中,行3处声明了一个i且未被初始化,行4声明了i并且立即初始化为0。
      

  12.   

    例一的i属于整个main函数,例二的i属于for循环,区别就是其作用域。
      

  13.   

    同样忽略编译器对定义重复变量的错误。我在把上面的回复写表达得清楚一点:
    void somemethod()
    {
        int i;                                // 这里是行3            
        for (int i =0; i< 5; i++)    // 这是行4
        {
              for (int i = 0; i<10; i++)  //这是行6
               {
                       
               }    // 这一对大括号是行6的i的生存和作用范围。 
        }   // 这对大括号里,是行4声明的i的生存和作用域 ,其作用域包括行6的一对大括号在内
    }    // 这对大括号,是行3声明的i的生存和作用域,其作用域包括行4和行6的两对大括号在内
      

  14.   

    没明白你说的东西。重复一下示例二的代码:
    void somemethod()
    {
        for (int i=0; i<10; i++)
        {
        }
      
      // 到这行,for循环里声明的i已经“死”了,下面的Writeline(i)会因为没有定义i而出现编译错误
        Console.Writeline(i);     // 到这里,已经没有一个局部变量 i 可供引用。
    }
      

  15.   

    sp 在#4的回复说的很清楚了int i;
    for(i=0;...)

    for(int i=0;...)能等价么