chinalu

Just do IT

用户操作
[即时聊天] [发私信] [加为好友]
luyiping ID:luyiping
111970次访问,排名783好友0人,关注者0
luyiping的文章
原创 46 篇
翻译 4 篇
转载 36 篇
评论 329 篇
chinalu的公告
最近评论
Sky:我也想要一个邀请码,lzbnet@163.com 谢谢!
andy:大哥,如果还有邀请码的话再给小弟我一个hdbits.org的邀请码吧。。。
小弟邮箱:lixiaojin20life@yahoo.com.cn
handy:其实还是用JS了 CSS里的expression 效率其实不高
GOLDSEX:大哥能给小弟一个hdbits.org的邀请码吗?
找了一年多了。谢谢大哥。小弟邮箱
GOLDSEX@LIVE.COM

GOLDSEX.GOLDSEX@GMAIL.COM
lqy45:樓主,如果還有的話,能發給我嗎,謝謝
lqy_45@hotmail.com
文章分类
收藏
相册
技术资源站
Asp.net
C#Corner
codeguru
CSharpFriends.com
GotDotNet
mono
SourceForge.net
The Code Project
UMLChina
xml.com
中国软件
微软中国社区
网站邀请发送
hdbits.org邀请
wallop邀请
友情链接
|><|神秘花園
Doodling Zola
卡卡先生(RSS)
我的人生我的梦
生如夏花
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 C#陷阱:int i = 10; i += i++; i = ?收藏

新一篇: C#中的析构函数[翻译] | 旧一篇:  如何动态加载控件以及插件编程思想(C#)

        参加某公司的笔试时的一道题目:int i = 10;  i += i++;  i = ?。当时我写了21。但当我在C#中写了如下代码测试时  

static void Main(string[] args)
  {
           int i = 10;
           i += i++;
           Console.WriteLine(i);
           Console.Read();
  }

编译器告诉我,结果是20。为什么!我错了吗?我开始纳闷了。我赶紧用VC(Visual Studio.net2003)重新编了一段测试代码,如下:

int _tmain()
{
           int i = 10;
           i +=  i++;
          Console::WriteLine(i);
          Console::Read();
          return 0;
}

这次,结果是21。奇怪了啊,为什么同样是i +=  i++,其结果是不一样的呢?

最终结论:语言差异

C# does have explicit rules around this behavior. (left to right)
C++ does not (problem of the C++ language, not the compiler)

发表于 @ 2004年07月19日 14:51:00|评论(loading...)|编辑

新一篇: C#中的析构函数[翻译] | 旧一篇:  如何动态加载控件以及插件编程思想(C#)

评论

#Howard 发表于2004-07-19 20:18:00  IP: 218.78.216.*
这是编辑器实现的问题
当初学编译原理时,就遇到过很多这样的问答题:)
所以有人说,对于一种语言,绝对不要依赖一种编译器
#twodays 发表于2004-07-19 16:06:00  IP: 61.51.147.*
http://www.cnblogs.com/twodays/archive/2004/07/19/25600.aspx
#路亦平 发表于2004-07-19 17:26:00  IP: 221.12.3.*
你的解释很好,我也用反编译看了代码。
#honiin 发表于2004-07-20 10:30:00  IP: 218.11.224.*
原因是:原式子是:i+=i++,我们先把前一个i定义为:i1,后一个i定义为i2,式子现在为i1+=i2++;编译器先做:i1+=i2,此时的i1=20,然后在做i2++,由于式子是返回I1,所以结果是20;
#路亦平 发表于2004-07-20 10:43:00  IP: 221.12.7.*
楼上解释不合理啊,其实是编译器对语言实现上的差别
#Honiin 发表于2004-07-20 15:34:00  IP: 218.11.224.*
楼上的朋友:
是呀,这是我根据C#编译器做出的结果.此结果这就是此式在C#编译下执行的顺序.不同的编译器对不同的语言有不同的执行顺序.
#午夜听风 发表于2004-08-04 20:23:00  IP: 219.133.90.*
呵呵,俺最讨厌这样写法
#Runna 发表于2004-11-03 20:56:00  IP: 219.220.146.*
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 18 (0x12)
.maxstack 4
.locals init ([0] int32 i)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldloc.0
IL_0005: dup
IL_0006: ldc.i4.1
IL_0007: add
IL_0008: stloc.0
IL_0009: add
IL_000a: stloc.0
IL_000b: ldloc.0
IL_000c: call void [mscorlib]System.Console::WriteLine(int32)
IL_0011: ret
} // end of method Test::Main

虽然能看个一只半懂,在堆栈上做了一系列操作。但是有没有高手能分析一下为什么会出现这个结果?
#fans1 发表于2004-11-04 10:09:00  IP: 222.183.21.*
IL_0000: ldc.i4.s 10
IL_0002: stloc.0

局部变量0 = 10

IL_0003: ldloc.0
IL_0004: ldloc.0
IL_0005: dup
IL_0006: ldc.i4.1
IL_0007: add
IL_0008: stloc.0


局部变量0 = 11

IL_0009: add
IL_000a: stloc.0

注意这两句 add是从stack中去两个相加然后把结果压入stack
前面11的那个值已经保存到局部变量0中,而目前从stack取出来的两个值都是为10的,这是之前压入的,所以计算出来为20

然后IL_000a那句把局部变量该写为20,于是11就被冲掉了

不知道是否有错误,请指出
#icynosure 发表于2004-11-05 17:09:00  IP: 211.151.89.*
c#是急求值
c++是懒求值
发表评论  


登录
Csdn Blog version 3.1a
Copyright © chinalu