当前位置:  开发笔记 > 编程语言 > 正文

C#编译器行为问题?

如何解决《C#编译器行为问题?》经验,为你挑选了3个好方法。

嘿大家,在下面的代码中,d的结果应该在第二个表达式之后是什么?

        int d = 1;
        d += d++;

之后假设d为3,但是一元增量d ++似乎没有生效,d保持值为2.

这个bug有名字吗?是否存在支持C#等一元增量的其他编译器?



1> Guffa..:

这不是一个错误,它的行为完全符合预期.

+ =运算符扩展为:

d = d + d++;

这意味着当结果被分配回变量时,将覆盖++运算符导致的更改.


完全扩展将是:temp = d + d; d = d + 1; d = temp;

2> Brian Rasmus..:

如果你看看生成的IL,你会看到为什么结果是2而不是3.

IL_0000:  ldc.i4.1  // load constant 1 on evaluation stack
IL_0001:  stloc.0   // pop and store value in local 0
IL_0002:  ldloc.0   // load value of local 0 on evaluation stack
IL_0003:  ldloc.0   // repeat, stack is now 1, 1
IL_0004:  dup       // duplicate topmost value on evaluation stack, 
                    // i.e. stack is now 1, 1, 1
IL_0005:  ldc.i4.1  // load constant 1 on evaluation stack
IL_0006:  add       // add two topmost values on stack, 
                    // i.e. 1 and 1 and push result on stack
IL_0007:  stloc.0   // pop and store this value in local 0
IL_0008:  add       // add the two remaining values on the stack
                    // which again happens to be 1 and 1 and push result to stack
IL_0009:  stloc.0   // pop and store this value in local 0

换句话说:存储的最终值是1和1的总和.

(上面的代码来自发布模式构建)



3> Donut..:

如果以这种方式重写代码,则将d设置为值3:

int d = 1;
d += ++d;

查看++操作员文档,了解您的示例为何如此运行.
摘抄:

第二种形式是后缀增量操作.操作的结果是操作数增加之前的值.

正如@Guffa指出的那样,它不是一个bug,只是你的postfix增量操作的结果d+=操作覆盖了.


我想你的甜甜圈有一个漏洞.不同的问题?
推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有