[轉錄]Re: [問題][C] pointer,++,--,priority
※ [本文轉錄自 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,
07/27 17:47
※ 編輯: ckclark 來自: 140.112.30.35 (07/27 17:56)
推
07/27 18:33,
07/27 18:33
推
07/27 21:09,
07/27 21:09
--
妳憑什麼愛我...?
又憑什麼要走...!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.117.169