下面程序的输出结果为什么是x=1,y=2?

zhou410527 2007-12-24 10:13:55
class A
{
public static int x;
static A()
{
x = B.Y + 1;
}
}

class B
{
public static int Y = A.x + 1;
static B()
{

}
static void Main()
{
Console.WriteLine("X={0},Y={1}",A.x,B.Y);
Console.Read();
}
}
...全文
562 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovesupper2008 2007-12-24
  • 打赏
  • 举报
回复
同意所有的回复!心动啊!
smaworm 2007-12-24
  • 打赏
  • 举报
回复
更正点我的错我,经过实际调试验证,证明调用的过程是这样的,
static class Program
{
public static int Y = A.x + 1;
static Program()
{
MessageBox.Show("B的构造函数");
}
static void Main()
{
MessageBox.Show("x= " + A.x + ",y=" + Program.Y);
}
}

class A
{
public static int x;
static A()
{
MessageBox.Show("x的值 =" +x.ToString());
x = Program.Y + 1;
MessageBox.Show("Y的值 = "+Program.Y.ToString());
MessageBox.Show("构造结束X ="+x.ToString());
}
}

此时结果输出为:
x的值 = 0
Y的值 = 0
构造结束X = 1
B的构造函数
x= 1,y=2

但是当如下面写的时候
static class Program
{
//public static int Y = A.x + 1;
public static int Y = 1;
static Program()
{
MessageBox.Show("B的构造函数");
}
static void Main()
{
MessageBox.Show("x= " + A.x + ",y=" + Program.Y);
}
}

class A
{
public static int x;
static A()
{
MessageBox.Show("x的值 =" +x.ToString());
x = Program.Y + 1;
MessageBox.Show("Y的值 = "+Program.Y.ToString());
MessageBox.Show("构造结束X ="+x.ToString());
}
}

输出的结果为:
B的构造函数
x值 = 0
Y的值 = 1
构造结束X = 2
x=2,y=1

由此可看出,调用顺序是这样的,数值型的静态变量初始化都先为0,然后才开始计算,先初始化main函数所在的静态变量和静态构造函数,后初始化其他类中的静态变量和静态构造函数。不过在main函数所在类静态变量初始化过程中遇到了其他类中的静态变量,会先对使用到的静态变量和静态函数做初始化。
流程就是 先初始化y = a.x +1;因为遇到了a.x 所以转入到 A类,计算A.x的值,此时B.y的值因为还没有计算所以仍然为0,计算结束后,继续执行调用B的静态构造函数。
bo3235 2007-12-24
  • 打赏
  • 举报
回复
同意7楼观点 并补充如下:也是实际调试结果

执行顺序如下:

public static int x;
public static int Y = A.x + 1; //注意 Y=0,没有执行赋值操作
static A() //此时调用A的构造函数
{
x = B.Y + 1;
}
public static int Y = A.x + 1; //赋值操作
static B()
{

}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.x, B.Y);
Console.Read();
}
lsj_zrp 2007-12-24
  • 打赏
  • 举报
回复
会不会调用,设断点调试一下就知道了
不要专注于理论,实际操作才能更好的了解!
呵呵
smaworm 2007-12-24
  • 打赏
  • 举报
回复
呵呵,4楼的朋友可能没有很好的理解静态变量和静态构造函数的含义,最好亲自调试下就知道是不是你想的那种结果了。
静态变量是在编译的时候就开始赋值的,而不是当进入到main函数当中才有值。
静态构造函数也是在main函数调用之前执行且与基构造函数不同,静态构造函数执行且执行一次,上边的例子,比如你写一句A a= new A();这段代码是不会调用static A() { x = B.Y + 1; } 这段代码的,你可以自己试验。
当静态构造函数的内容执行完后,才开始执行main函数, Console.WriteLine("X={0},Y={1}", A.x, B.Y); 这句仅仅是调用静态变量的值,根本就涉及不到构造函数的问题。
xiaotupansy 2007-12-24
  • 打赏
  • 举报
回复
楼主的写法等同于

using System;
class A
{
public static int x;//具有初始值0
static A()
{
x = B.Y + 1;
}
}

class B
{
public static int Y;//具有初始值0
static B()
{
Y = A.x + 1;
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.x, B.Y);
Console.Read();
}
}

main函数在B里面,所以编译器首先是初始化B
首先是字段Y,Y是int型,编译器初始化为0 ,然后Y为static,所以编译器接着执行B的静态构造函数,注意一点,构造函数只执行一次
在static B()里面,Y被赋值为A.X+1,编译器接着去找A.X的值,此时执行A的静态构造函数,x=B.Y+1,因为B的构造函数已经执行了,此时就不执行第二次,Y此时具有
值是0,所以X=1;然后返回Y=A.X+1,Y=2
所以答案就是X=1;Y=2;

注意两点就可以了:初始化顺序是先字段后构造函数,每个字段都有一个初始的默认值
lsj_zrp 2007-12-24
  • 打赏
  • 举报
回复
你会发现
class A
{
public static int x;
A()
{
x = B.Y + 1;
}
}

class B
{
public static int Y = A.x + 1;
B()
{

}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.x, B.Y);
Console.Read();
}
}
结果x=0,y=1
因为此时,并没有调用A,B的构造函数,只是用到了定义而已
lsj_zrp 2007-12-24
  • 打赏
  • 举报
回复
Console.WriteLine("X={0},Y={1}",A.x,B.Y);
先执行public static int Y = A.x + 1;
因为有A.x所以会调用
static A()
{
x = B.Y + 1;
}
而调用A()时,Y的值还没有计算出来,所以此时B.Y=0,从而得出x=1
然后回到public static int Y = A.x + 1得出Y=2

levenwood 2007-12-24
  • 打赏
  • 举报
回复
首先编译器生成代码,初始化静态字段,此时x=1;y=0;
(原因a的构造函数点用B,而B构造函数里是空的,y默认为0,所以x=1,y=0);
B.Y=1+1;
y=2;
看程序猜得~
smaworm 2007-12-24
  • 打赏
  • 举报
回复
很基础的问题,首先编译器生成代码,初始化静态字段,此时x= 0;y = 1;
然后执行静态构造函数代码,x= 1+ 1; 注意 静态构造函数代码只执行一次。
最后结果x =2,y=1 楼主说的答案也写反了。
syf1125 2007-12-24
  • 打赏
  • 举报
回复
应该是X=2,Y=1
zhou410527 2007-12-24
  • 打赏
  • 举报
回复
谢谢各位!

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧