C语言高级编程:i++ 或 ++i作为函数参数
測試機:Ubuntu14.04 x86_64
?
?
1. 代碼:
#include <stdio.h>void print(int a, int b, int c) {printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c); }void main(void) {int para1 = 5;int para2 = 6;int para3 = 7;print(para1++, ++para2, para3);printf("a = %d\n", para1);printf("b = %d\n", para2);printf("c = %d\n", para3); }?
2. 結(jié)果:
baoli@ubuntu:~/c$ ./a.out a = 5 b = 7 c = 7 a = 6 b = 7 c = 7?
?
3. 反匯編:
000000000040052d <print>:40052d: 55 push %rbp40052e: 48 89 e5 mov %rsp,%rbp400531: 48 83 ec 10 sub $0x10,%rsp400535: 89 7d fc mov %edi,-0x4(%rbp)400538: 89 75 f8 mov %esi,-0x8(%rbp)40053b: 89 55 f4 mov %edx,-0xc(%rbp)40053e: 8b 45 fc mov -0x4(%rbp),%eax400541: 89 c6 mov %eax,%esi400543: bf 84 06 40 00 mov $0x400684,%edi400548: b8 00 00 00 00 mov $0x0,%eax40054d: e8 be fe ff ff callq 400410 <printf@plt>400552: 8b 45 f8 mov -0x8(%rbp),%eax400555: 89 c6 mov %eax,%esi400557: bf 8c 06 40 00 mov $0x40068c,%edi40055c: b8 00 00 00 00 mov $0x0,%eax400561: e8 aa fe ff ff callq 400410 <printf@plt>400566: 8b 45 f4 mov -0xc(%rbp),%eax400569: 89 c6 mov %eax,%esi40056b: bf 94 06 40 00 mov $0x400694,%edi400570: b8 00 00 00 00 mov $0x0,%eax400575: e8 96 fe ff ff callq 400410 <printf@plt>40057a: c9 leaveq40057b: c3 retq 000000000040057c <main>:40057c: 55 push %rbp40057d: 48 89 e5 mov %rsp,%rbp400580: 48 83 ec 10 sub $0x10,%rsp400584: c7 45 f4 05 00 00 00 movl $0x5,-0xc(%rbp)40058b: c7 45 f8 06 00 00 00 movl $0x6,-0x8(%rbp)400592: c7 45 fc 07 00 00 00 movl $0x7,-0x4(%rbp)400599: 83 45 f8 01 addl $0x1,-0x8(%rbp)40059d: 8b 45 f4 mov -0xc(%rbp),%eax4005a0: 8d 50 01 lea 0x1(%rax),%edx4005a3: 89 55 f4 mov %edx,-0xc(%rbp)4005a6: 8b 55 fc mov -0x4(%rbp),%edx4005a9: 8b 4d f8 mov -0x8(%rbp),%ecx4005ac: 89 ce mov %ecx,%esi4005ae: 89 c7 mov %eax,%edi4005b0: e8 78 ff ff ff callq 40052d <print>4005b5: 8b 45 f4 mov -0xc(%rbp),%eax4005b8: 89 c6 mov %eax,%esi4005ba: bf 84 06 40 00 mov $0x400684,%edi4005bf: b8 00 00 00 00 mov $0x0,%eax4005c4: e8 47 fe ff ff callq 400410 <printf@plt>4005c9: 8b 45 f8 mov -0x8(%rbp),%eax4005cc: 89 c6 mov %eax,%esi4005ce: bf 8c 06 40 00 mov $0x40068c,%edi4005d3: b8 00 00 00 00 mov $0x0,%eax4005d8: e8 33 fe ff ff callq 400410 <printf@plt>4005dd: 8b 45 fc mov -0x4(%rbp),%eax4005e0: 89 c6 mov %eax,%esi4005e2: bf 94 06 40 00 mov $0x400694,%edi4005e7: b8 00 00 00 00 mov $0x0,%eax4005ec: e8 1f fe ff ff callq 400410 <printf@plt>4005f1: c9 leaveq4005f2: c3 retq 4005f3: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)4005fa: 00 00 004005fd: 0f 1f 00 nopl (%rax)?
?
4. 分析:
1.?對于para1++,先保存5到eax,后面會將eax保存到edi,所以edi也是5;然后再將值+1存到edx和rbp,所以edx和rbp都是6,由于在print中使用的是edi,所以打印是5
mov????-0xc(%rbp),%eax
lea????0x1(%rax),%edx
mov????%edx,-0xc(%rbp)
mov????%eax,%edi
2.?對于++para2,先+1,然后保存到ecx和esi,由于在print使用esi,所以打印是7
addl???$0x1,-0x8(%rbp)
mov????-0x8(%rbp),%ecx
mov????%ecx,%esi
3.?對于para3
mov????-0x4(%rbp),%edx
4.?對于下列結(jié)果,由于使用的都是rpb,所以都是自增后的值
a = 6? ? //mov????-0xc(%rbp),%eax
b = 7? ? //mov????-0x8(%rbp),%eax
c = 7
?
注:上述參數(shù)傳遞沒有使用入棧的方式,而是直接使用了寄存器傳(eax、ecx、edx、esi、edi)遞變量值,速度更快。
?
?
5. 總結(jié):
1)?函數(shù)參數(shù)盡量不要使用++的形式,容易混淆,如果必須使用,使用++i形式。
2)++i作為函數(shù)參數(shù)時,傳入函數(shù)內(nèi)部的是自增后的值; i++作為函數(shù)參數(shù)時,傳入函數(shù)內(nèi)部的是原值(自增前)
3)無論是++i還是i++最后都會使值加1
?
總結(jié)
以上是生活随笔為你收集整理的C语言高级编程:i++ 或 ++i作为函数参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界8.15惑龙在哪 惑龙刷新位置介
- 下一篇: C语言高级编程:const限定函数形参