问题如下:
示例一: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的声明和初始化呢?
示例一: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的声明和初始化呢?
在示例一中,为了解释j值的错误我把for(i=0;i<=10;i++)(j=9;)
理解为
i=0;
while(i<=10)
{
j=9;
i++;
}
这样我就可以理解j值错在未初始化~可示例二却推翻了我的理解~迷惑啊
你使用什么编译工具?第二段代码可以编译通过?离开了for循环这个语句块,并不存在变量i声明,根本无法知道随后Console.Write中的i是什么!
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的声明和初始化呢?
非常楼上各位的解答,这个问题的关键就是在于“编译器是如何对待for语句最开始的i=0(或int i=0)”,谢谢qingyun1029把这个问题提炼出来!也希望有谁能帮我解答清楚啊!
那示例一中的i=0;是属于Main函数,还是属于for语句呢?
示例二中的int i=0呢?
{
int i; // 这里是行3
for (int i =0; i< 5; i++) // 这是行4
{
// 这对大括号里,是行4声明的i的作用域
}
} // 这对大括号,是行3声明的i的作用域
暂且不论上面的代码重复定义了2个同样的局部变量i,会引发编译错误,仅作区分二者的作用域。其中,行3处声明了一个i且未被初始化,行4声明了i并且立即初始化为0。
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的两对大括号在内
void somemethod()
{
for (int i=0; i<10; i++)
{
}
// 到这行,for循环里声明的i已经“死”了,下面的Writeline(i)会因为没有定义i而出现编译错误
Console.Writeline(i); // 到这里,已经没有一个局部变量 i 可供引用。
}
for(i=0;...)
和
for(int i=0;...)能等价么