嘿大家,在下面的代码中,d的结果应该在第二个表达式之后是什么?
int d = 1; d += d++;
之后假设d为3,但是一元增量d ++似乎没有生效,d保持值为2.
这个bug有名字吗?是否存在支持C#等一元增量的其他编译器?
这不是一个错误,它的行为完全符合预期.
+ =运算符扩展为:
d = d + d++;
这意味着当结果被分配回变量时,将覆盖++运算符导致的更改.
如果你看看生成的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的总和.
(上面的代码来自发布模式构建)
如果以这种方式重写代码,则将d设置为值3:
int d = 1; d += ++d;
查看++操作员文档,了解您的示例为何如此运行.
摘抄:
第二种形式是后缀增量操作.操作的结果是操作数增加之前的值.
正如@Guffa指出的那样,它不是一个bug,只是你的postfix增量操作的结果d
被+=
操作覆盖了.