C++与Java编译器的差别偶拾

近日,对各语言之间的差异起了兴趣,针对一些常用的运算进行了考察,随便记录了一些差别。

首先是 ++ 的运算:

//C++
int i = 3;
cout << i++ * i++ << endl;//输出 9
i = 3;
cout << ++i * ++i << endl;//输出 25
//汇编片段
0x0000000100000cf2 <main+21>:    movl   $0x3,-0x4(%rbp)
0x0000000100000cf9 <main+28>:    mov    -0x4(%rbp),%eax
0x0000000100000cfc <main+31>:    mov    %eax,%esi
0x0000000100000cfe <main+33>:    imul   -0x4(%rbp),%esi
0x0000000100000d02 <main+37>:    incl   -0x4(%rbp)
0x0000000100000d05 <main+40>:    incl   -0x4(%rbp)
0x0000000100000d08 <main+43>:    mov    0x321(%rip),%rdi        # 0x100001030
0x0000000100000d0f <main+50>:    callq  0x100000dca <dyld_stub__ZNSolsEi>
0x0000000100000d14 <main+55>:    mov    %rax,%rdi
0x0000000100000d17 <main+58>:    mov    0x31a(%rip),%rsi        # 0x100001038
0x0000000100000d1e <main+65>:    callq  0x100000dc4 <dyld_stub__ZNSolsEPFRSoS_E>
0x0000000100000d23 <main+70>:    movl   $0x3,-0x4(%rbp)
0x0000000100000d2a <main+77>:    incl   -0x4(%rbp)
0x0000000100000d2d <main+80>:    incl   -0x4(%rbp)
0x0000000100000d30 <main+83>:    mov    -0x4(%rbp),%eax
0x0000000100000d33 <main+86>:    mov    %eax,%esi
0x0000000100000d35 <main+88>:    imul   -0x4(%rbp),%esi
0x0000000100000d39 <main+92>:    mov    0x2f0(%rip),%rdi        # 0x100001030
0x0000000100000d40 <main+99>:    callq  0x100000dca <dyld_stub__ZNSolsEi>

//JAVA
int i = 3;
System.out.println(i++ * i++);// 输出 12
i = 3;
System.out.println(++i * ++i);// 输出 20

//Javascript
var i = 3;
alert(i++ * i++); // 输出 12

可见,
C++中,同一条语句中的多个 i++ 操作并不会逐个先执行,而是该语句执行结束之后,才会逐个执行++运算的;
而 ++i 的操作,却是先逐个执行一遍,完毕之后,以统一身份(最后运算结果)参与运算的;所有运算++的操作没有使用临时变量。
JAVA与Javascript中,则是将运算式拆解开来,先逐个计算++操作,每个++操作的值会放置到不同的临时变量里,然后对临时变量进行计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值