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