Re: [問題] function的問題
※ 引述《xshane831 (Shane)》之銘言:
: 應該是基本的觀念問題,但我沒學好..
: 就是為何函式傳參數進去但沒有改變原始的值
: void dd(int x);
: int main()
: {
現在不開編譯器優化 倒出來的CPU母語該差不多是這樣
假設 int yes 在 EBP -8
: int yes=0;
MOV EBX [EBP - 8]
PUSH EBX
call dd; /* 調用函數dd */
: dd(yes);
ADD EPS, 4;
注意這行 ,離開函數後這位置被刷掉
也就是這值根本就是免洗的,只單純用來傳入函數
: cout<<yes;
: return 0;
: }
: void dd(int x)
: {
PUSH EBP;
MOV EBP ESP;
MOV EAX, [EBP + 8];
: x=50+50;
MOV EBX, 50;
ADD EBX, 50; /*50 + 50*/
MOV [EBP + 8], EBX; /*[EBP + 8]即為int x*/
看到了吧, 在函數內是把結果存在堆棧上
但這結果 在離開函數後
儲存的值,被當免洗內容刷掉了
(因為函數外的ESP管理不會干涉到函數內部)
POP EBP;
XOR EAX, EAX;
RET;
: }
: 我認為最後yes應該要是100,但還是0,有改寫成
: void(int x, int y)
: {
: x=50+50
: y=x;
: }
: 並在main裡用另一個值yes2當第二個參數傳入,最終也沒改變
: 雖然改成int dd(int x)可以
: 而如果函式傳兩個以上參數且都需要回傳,改成return陣列也可以
: 但想知道為何不會改變原始傳進去的值,如: yes
: 但用一些library,類似OpenCV,類似void cvSmooth(src, dst...) 就可
: 請問是為什麼? 我哪邊的觀念卡住了?
: 感恩!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.176.104.49
推
03/25 19:53, , 1F
03/25 19:53, 1F
推
03/25 20:22, , 2F
03/25 20:22, 2F
→
03/25 21:03, , 3F
03/25 21:03, 3F
推
03/25 22:08, , 4F
03/25 22:08, 4F
噓
03/26 11:24, , 5F
03/26 11:24, 5F
→
03/26 11:25, , 6F
03/26 11:25, 6F
推
03/26 11:32, , 7F
03/26 11:32, 7F
※ 編輯: Move192 來自: 180.176.104.49 (03/26 14:45)
推
03/26 20:51, , 8F
03/26 20:51, 8F
推
03/26 20:53, , 9F
03/26 20:53, 9F
→
03/26 21:02, , 10F
03/26 21:02, 10F
→
03/26 22:22, , 11F
03/26 22:22, 11F
→
03/26 22:26, , 12F
03/26 22:26, 12F
→
03/26 22:29, , 13F
03/26 22:29, 13F
→
03/26 22:29, , 14F
03/26 22:29, 14F
討論串 (同標題文章)