[轉錄]Re: [問題][C] pointer,++,--,priority

看板SFFamily作者 (迷惑失道)時間15年前 (2008/12/24 10:39), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 C_and_CPP 看板] 作者: ckclark (大資佬) 看板: C_and_CPP 標題: Re: [問題][C] pointer,++,--,priority 時間: Fri Jul 27 17:46:44 2007 ※ 引述《GABA (dfasfd)》之銘言: : 我想問一個 : include <stdio.h> : main() : { : int list[5]; : int *p; : int i; : for (i=0; i<5; i++) : list[i]=i; : p=list; : printf("%d, %d, %d\n", *++p, *p++, *(p+1)); : return 0; : } : 我跑完的結果是2,0,1 : 可是我不懂為蛇麼 有人可以指導一下嗎? : 感恩! 這種沒有定義的行為 就只能看組語說故事囉... 說實在的 COMPILE出怎樣的結果都不能說COMPILER錯啦 mov DWORD PTR [%rbp-4], 0 # i, jmp .L2 # # 這段是for迴圈 .L3: mov %eax, DWORD PTR [%rbp-4] # i.0, i movsx %rdx, %eax # i.0, i.0 mov %eax, DWORD PTR [%rbp-4] # i, i mov DWORD PTR [%rbp-48+%rdx*4], %eax # list, i add DWORD PTR [%rbp-4], 1 # i, .L2: cmp DWORD PTR [%rbp-4], 4 # i, jle .L3 #, # for 迴圈結束 # 首先這邊先說明一下 # [%rbp-16] 就是所謂的p這個pointer的位址 #而一些D.194x就當做個暫存的變數吧 lea %rax, [%rbp-48] # tmp67, mov QWORD PTR [%rbp-16], %rax # p, tmp67 #這邊是p=list mov %rax, QWORD PTR [%rbp-16] # D.1942, p #把p的值存到rax裡 add %rax, 4 # D.1942, #把rax+=4 也就是rax目前指的是list[1] mov %ecx, DWORD PTR [%rax] # D.1943,* D.1942 #把list[1]的值存到ecx裡 mov %rax, QWORD PTR [%rbp-16] # p, p mov %edx, DWORD PTR [%rax] # D.1944,* p #這邊就是讓list[0](=*p)存到edx裡面 add QWORD PTR [%rbp-16], 4 # p, #p+=4 add QWORD PTR [%rbp-16], 4 # p, #p+=4 mov %rax, QWORD PTR [%rbp-16] # p, p #讓rax=p mov %esi, DWORD PTR [%rax] # D.1945,* p #讓esi=*p (相當於list[2]) mov %edi, OFFSET FLAT:.LC0 #, mov %eax, 0 #, call printf # #這裡的參數呢 #第一個是edi "%d, %d, %d\n" #第二個是esi (list[2]) #第三個是edx (list[0]) #第四個是ecx (list[1]) mov %eax, 0 # D.1946, leave ret 至於為什麼會這樣compile呢 可以仔細觀察rax 看起來他就是負責運算++p,p++,p+1這些位址的 而這個順序是反過來的(從最後一個參數算回來) 再看一遍code mov %rax, QWORD PTR [%rbp-16] # D.1942, p add %rax, 4 # D.1942, mov %ecx, DWORD PTR [%rax] # D.1943,* D.1942 #這三行是算*(p+1) mov %rax, QWORD PTR [%rbp-16] # p, p mov %edx, DWORD PTR [%rax] # D.1944,* p add QWORD PTR [%rbp-16], 4 # p, #這三行是算*p++ add QWORD PTR [%rbp-16], 4 # p, mov %rax, QWORD PTR [%rbp-16] # p, p mov %esi, DWORD PTR [%rax] # D.1945,* p #這三行是算*++p mov %edi, OFFSET FLAT:.LC0 #, 不過重點是 沒人定義一定要從後面算回來 要是從第一個參數開始算 不就囧了 所以拿來當考題很沒道理的 補一下 我的compiler是 gcc 4.1.3 20070601 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.35

07/27 17:47,
慢了一步 ....
07/27 17:47

07/27 17:47,
XD 可是我的沒有說很清楚 勾錯選項 不太好看
07/27 17:47
※ 編輯: ckclark 來自: 140.112.30.35 (07/27 17:56)

07/27 18:33,
其實結論是什麼結果都有可能,要看 compiler 怎麼做
07/27 18:33

07/27 21:09,
推.....
07/27 21:09
-- 妳憑什麼愛我...? 又憑什麼要走...! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.117.169
文章代碼(AID): #19KQ3IQT (SFFamily)