首页 > 代码库 > ++i 和 i++的输出
++i 和 i++的输出
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, const char *argv[]) { int x, y; x = y = 0; printf("%d %d %d\n", ++x, ++x, ++x); printf("%d %d %d\n", y--, ++y, y); return 0; }
输出结果为:3 3 3
1 0 0
在vs中:printf输出时,从输出表达式右到左计算,然后从右到左入栈,再出栈
vs中的汇编下的代码:
<pre class="cpp" name="code"> 5: int main(int argc, const char *argv[]) 6: { 013B13D0 55 push ebp 013B13D1 8B EC mov ebp,esp 013B13D3 81 EC DC 00 00 00 sub esp,0DCh 013B13D9 53 push ebx 013B13DA 56 push esi 013B13DB 57 push edi 013B13DC 8D BD 24 FF FF FF lea edi,[ebp-0DCh] 013B13E2 B9 37 00 00 00 mov ecx,37h 013B13E7 B8 CC CC CC CC mov eax,0CCCCCCCCh 013B13EC F3 AB rep stos dword ptr es:[edi] 7: int x, y; 8: x = y = 0; 013B13EE C7 45 EC 00 00 00 00 mov dword ptr [y],0 013B13F5 8B 45 EC mov eax,dword ptr [y] 013B13F8 89 45 F8 mov dword ptr [x],eax 9: printf("%d %d %d\n", ++x, ++x, ++x); 013B13FB 8B 45 F8 mov eax,dword ptr [x] 013B13FE 83 C0 01 add eax,1 013B1401 89 45 F8 mov dword ptr [x],eax 013B1404 8B 4D F8 mov ecx,dword ptr [x] 013B1407 83 C1 01 add ecx,1 013B140A 89 4D F8 mov dword ptr [x],ecx 013B140D 8B 55 F8 mov edx,dword ptr [x] 013B1410 83 C2 01 add edx,1 013B1413 89 55 F8 mov dword ptr [x],edx 013B1416 8B F4 mov esi,esp 013B1418 8B 45 F8 mov eax,dword ptr [x] 013B141B 50 push eax 013B141C 8B 4D F8 mov ecx,dword ptr [x] 013B141F 51 push ecx 013B1420 8B 55 F8 mov edx,dword ptr [x] 013B1423 52 push edx 013B1424 68 B8 58 3B 01 push 13B58B8h 013B1429 FF 15 14 91 3B 01 call dword ptr ds:[13B9114h] 013B142F 83 C4 10 add esp,10h 013B1432 3B F4 cmp esi,esp 013B1434 E8 07 FD FF FF call __RTC_CheckEsp (013B1140h) 10: printf("%d %d %d\n", y--, ++y, y); 013B1439 8B 45 EC mov eax,dword ptr [y] 10: printf("%d %d %d\n", y--, ++y, y); 013B143C 83 C0 01 add eax,1 013B143F 89 45 EC mov dword ptr [y],eax 013B1442 8B 4D EC mov ecx,dword ptr [y] 013B1445 89 8D 24 FF FF FF mov dword ptr [ebp-0DCh],ecx 013B144B 8B 55 EC mov edx,dword ptr [y] 013B144E 83 EA 01 sub edx,1 013B1451 89 55 EC mov dword ptr [y],edx 013B1454 8B F4 mov esi,esp 013B1456 8B 45 EC mov eax,dword ptr [y] 013B1459 50 push eax 013B145A 8B 4D EC mov ecx,dword ptr [y] 013B145D 51 push ecx 013B145E 8B 95 24 FF FF FF mov edx,dword ptr [ebp-0DCh] 013B1464 52 push edx 013B1465 68 B8 58 3B 01 push 13B58B8h 013B146A FF 15 14 91 3B 01 call dword ptr ds:[13B9114h] 013B1470 83 C4 10 add esp,10h 013B1473 3B F4 cmp esi,esp 013B1475 E8 C6 FC FF FF call __RTC_CheckEsp (013B1140h) 11: return 0; 013B147A 33 C0 xor eax,eax 12: }
--->在计算++x 和 x++时的区别:计算++x会取出x的值到寄存器中加1后写回x中,而x++则将x取出到寄存器,然后寄存器将值存入一个分配的地址,然后寄存器进行加1操作,结果写回x,但是输出的时候++x输出的是x的值,而x++输出的是分配的地址中存储的x加1之前的值(输出时会先取地址的值放入寄存器中,然后把寄存器中的值入栈)
int x = 0;
printf("%d %d %d" ,x++, x++, x++) --> 2 1 0 从右到左计算,从右到左入栈
取出x(0)-->放入寄存器-->分配一个地址1将x(0)存入-->x自加1-->写回x -->导致x = 1;
取出x(1) --> 放入寄存器-->分配一个地址2将x(1)存入-->x自加1-->写回x -->导致x = 2;
取出x(2) --> 放入寄存器-->分配一个地址3将x(2)存入-->x自加1-->写回x-->导致x = 3;
-->依次从地址1 地址2 地址3 取出内容入栈push
出栈 输出元素 2 1 0
++i 和 i++的输出
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。