关于x += x++的分析

C

源程序:

    #include <stdio.h>
    int main() {
        int x = 1;
        x += x++;
        printf("%d\n", x);
        return 0;
    }

程序运行结果:3

gcc test.c,拖入IDA进行分析。

汇编代码:

    mov     [esp+20h+var_4], 1
    mov     eax, [esp+20h+var_4]
    lea     edx, [eax+1]
    mov     [esp+20h+var_4], edx
    add     [esp+20h+var_4], eax
    mov     eax, [esp+20h+var_4]
    mov     [esp+20h+var_1C], eax
    mov     [esp+20h+Format], offset Format ; "%d\n"
    call    _printf
    leave
    retn

分析:

(esp+20h+var_4) 即为x

x置1
eax存x的备份
将edx置为eax + 1(即为2,x++的结果)
将edx放回x
x += eax
将x送入eax进行输出

所以x += x++就变成了:

    x1 = x++;
    x += x1;

即先做了 x++ 操作,返回了1,然后再进行 x += 1 操作。

为什么会这样呢?

因为运算符优先级中, ++ 远大于 +=

Java

    public class test {
        public static void main(String[] args) {
            int x = 1;
            x += x++;
        }
    }

程序运行结果:2

javac test.java 然后 javap -c test

汇编代码:

    0: iconst_1
    1: istore_1
    2: iload_1
    3: iload_1
    4: iinc     1, 1
    7: iadd
    8: istore_1
    9: return

分析:

  • 0: push 1
  • 1: pop x
  • 2: push x
  • 3: push x
  • 4: x++
  • 7: 弹出两数,相加后压入
  • 8: pop x

因此,x++的结果并没有被使用。

值得一提的是,在IDEA中,代码会有以下提示:
The value changed at 'x++' is never used

可见,一个优秀的IDE对于程序猿来说是很有必要的。

最后,感谢一下某学员