标签:blog http 使用 strong 2014 问题
一个大一学弟通过QQ给我发来一个C++的题:
int c = 8, b = 3; c += c-- | ++b;
问c的值是多少。通过笔算得到c为19,然后随手建了个C#控制台项目跑了一下,悲剧了。。。C#输出的为20。重新笔算一遍还是19啊,赶紧重新建了一个C++控制台项目跑出的结果为19。到底为什么C++和C#会不一样呢?
通过网上查资料得知,是C#求值顺序的问题,具体是怎么样的情况呢?我们来反汇编一下:
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 33 (0x21) .maxstack 4 .locals init ([0] int32 c, [1] int32 b) IL_0000: nop IL_0001: ldc.i4.8 IL_0002: stloc.0 IL_0003: ldc.i4.3 IL_0004: stloc.1 IL_0005: ldloc.0 IL_0006: ldloc.0 IL_0007: dup IL_0008: ldc.i4.1 IL_0009: sub IL_000a: stloc.0 IL_000b: ldloc.1 IL_000c: ldc.i4.1 IL_000d: add IL_000e: dup IL_000f: stloc.1 IL_0010: or IL_0011: add IL_0012: stloc.0 IL_0013: ldloc.0 IL_0014: call void [mscorlib]System.Console::WriteLine(int32) IL_0019: nop IL_001a: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() IL_001f: pop IL_0020: ret } // end of method Program::Main
通过IL代码我们可以清晰的看到他的计算过程:
c += c-- | ++b; 等价于 c = c + (c-- | ++b);,通过反汇编我们可以看出:
根据上面结论我们把算式改成c = (c-- | ++b) + c;,得到的结果为19。
那么C++到底是怎么执行的呢?继续,反编译之:
(上图反汇编的程序基于VS2013的C++ Debug编译结果,GCC 4.6.1的反汇编代码略有区别,执行过程一致,结论仅限定在这两个编译环境下) C++的执行过程:
从反汇编可以看出:
最后验证一下,改变算式为c = c * 2 + (c-- | ++b);C++的输出结果为27,8*2+12=28-1=27,反汇编也可以看到最后才执行的sub,图就不上了。
c += c-- | ++b;,布布扣,bubuko.com
标签:blog http 使用 strong 2014 问题
原文地址:http://www.cnblogs.com/zhang740/p/3811651.html