记得以前看过哪个运算符是从右到左运算,查了所有运算符都是从左到右。
后++是取了该值之后立马就自加一个,而不是运行完整个表达式才自加
(++i)=(i++)*(++i)的执行顺序为
1、对赋值号左边操作,i要先自加1,i==4
2、对赋值号右边进行操作,左乘数等于i,为4。然后i自加1 ,i=5,
3、再取i之前对i自加,i=6,把6给右乘数。
4、乘法4 * 6=24 ,赋值给i
上述代码的汇编:
0x0000000000401530 <+0>: push %rbp
0x0000000000401531 <+1>: mov %rsp,%rbp
0x0000000000401534 <+4>: sub $0x30,%rsp
0x0000000000401538 <+8>: callq 0x40e770 <__main>
0x000000000040153d <+13>: movl $0x3,-0x4(%rbp)
0x0000000000401544 <+20>: addl $0x1,-0x4(%rbp)//先对赋值左边进行了自加
0x0000000000401548 <+24>: mov -0x4(%rbp),%eax
0x000000000040154b <+27>: lea 0x1(%rax),%edx
0x000000000040154e <+30>: mov %edx,-0x4(%rbp)
0x0000000000401551 <+33>: addl $0x1,-0x4(%rbp)
0x0000000000401555 <+37>: mov -0x4(%rbp),%edx
0x0000000000401558 <+40>: imul %edx,%eax
0x000000000040155b <+43>: mov %eax,-0x4(%rbp)
=> 0x000000000040155e <+46>: mov -0x4(%rbp),%eax
0x0000000000401561 <+49>: mov %eax,%edx
0x0000000000401563 <+51>: mov 0x8b126(%rip),%rcx # 0x48c690 <.refptr._ZSt4cout>
0x000000000040156a <+58>: callq 0x44d530 <_ZNSolsEi>
0x000000000040156f <+63>: mov 0x8b12a(%rip),%rdx # 0x48c6a0 <.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_>
0x0000000000401576 <+70>: mov %rax,%rcx
0x0000000000401579 <+73>: callq 0x44d330 <_ZNSolsEPFRSoS_E>
0x000000000040157e <+78>: lea 0x86a7c(%rip),%rcx # 0x488001 <_ZStL19piecewise_construct+1>
0x0000000000401585 <+85>: callq 0x419bc8 <system>
0x000000000040158a <+90>: mov $0x0,%eax
0x000000000040158f <+95>: add $0x30,%rsp
0x0000000000401593 <+99>: pop %rbp
0x0000000000401594 <+100>: retq
指针大小问题
32位上是4字节,64位上是8字节