程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 前置和後置運算符

前置和後置運算符

日期:2017/1/21 16:28:28      編輯:C++入門知識

這是迅雷一問一答的題目: [cpp]  #include <stdio.h>      int main(void) {     int a, b;        a = 5;     a = a + a++;     printf("a = %d\n", a);        a = 5;     b = a + a++;     printf("b = %d\n", b);     return 0;   }     輸出的結果是: 反匯編過程: [cpp]   PUBLIC  _main   EXTRN   _printf:NEAR   _DATA   SEGMENT   $SG529  DB  'a = %d', 0aH, 00H   $SG530  DB  'b = %d', 0aH, 00H   _DATA   ENDS   _TEXT   SEGMENT   _a$ = -4   _b$ = -8   _main   PROC NEAR      ; 3    : int main(void) {          push    ebp       mov ebp, esp       sub esp, 8      ; 4    :   int a, b;   ; 5    :    ; 6    :   a = 5;          mov DWORD PTR _a$[ebp], 5                 ; 賦值,a = 5      ; 7    :   a = a + (a++);          mov eax, DWORD PTR _a$[ebp]       add eax, DWORD PTR _a$[ebp]               ; a += a(a = 10)       mov DWORD PTR _a$[ebp], eax       mov ecx, DWORD PTR _a$[ebp]       add ecx, 1                        ; a++,a = 11       mov DWORD PTR _a$[ebp], ecx        ; 8    :   printf("a = %d\n", a);          mov edx, DWORD PTR _a$[ebp]       push    edx       push    OFFSET FLAT:$SG529       call    _printf       add esp, 8      ; 9    :    ; 10   :   a = 5;          mov DWORD PTR _a$[ebp], 5      ; 11   :   b = a + (a++);          mov eax, DWORD PTR _a$[ebp]       add eax, DWORD PTR _a$[ebp]                ; a += a(a = 10,b = 10)       mov DWORD PTR _b$[ebp], eax       mov ecx, DWORD PTR _a$[ebp]       add ecx, 1                         ; a++,a = 11,b不變       mov DWORD PTR _a$[ebp], ecx      ; 12   :   printf("b = %d\n", b);          mov edx, DWORD PTR _b$[ebp]       push    edx       push    OFFSET FLAT:$SG530       call    _printf       add esp, 8      ; 13   :   return 0;          xor eax, eax      ; 14   : }          mov esp, ebp       pop ebp       ret 0   _main   ENDP   _TEXT   ENDS   END     首先有一點必須要明確的是:表達式的運算順序是從左到右的 1. 對於 a = a + a++; 運算過程是:a = 5 + 5 = 10,然後 a 再自加 2. 對於 b = a + a++; 運算過程是:b = 5 + 5 = 10,然後 a 再自加   再看一個稍微復雜點的程序: [cpp]   #include <stdio.h>      int main(void) {     int a, b;        a = 5;     a = a++ + a++;     printf("a = %d\n", a);        a = 5;     b = (++a) + (a++) + (a++) + (++a) + (++a) + (a--);     printf("a = %d\n", a);     printf("b = %d\n", b);     return 0;   }     運算結果是: 不貼ASM代碼了 ----------------------------------- 首先有一點必須要明確的是:表達式的運算順序是從左到右的 語句 a = a++ + a++; 的執行過程是: 1. 第一個 a++ 的結果是5,第二個 a++ 的結果也是5 2. 此時表達式的結果是 a = 5 + 5 = 10,然後 a 再執行 2 個自加   語句 b = (++a) + (a++) + (a++) + (++a) + (++a) + (a--); 的執行過程是: 1. 第一個 ++a 的結果是6 2. 兩個 a++ 的結果都是6 3. 前一個 ++a 的結果是7,後一個 ++a 的結果是8 4. a-- 的結果是8   最後表達式的結果是 b = 6+6+6+7+8+8 = 41,接下來就是更新 a 的值了,a一共有2次後置自加,1次後置自減,所以a = a + 2 -1 = 9(因為前置運算在表達式運算時已經運算過,而到表達式運算結束時a的值是8)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved