日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言高级编程:i++ 或 ++i作为函数参数

發(fā)布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言高级编程:i++ 或 ++i作为函数参数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

測試機: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。