首页 > 代码库 > ++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++的输出