![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - 關於資料結構..call by ***
(https://www.pcdvd.com.tw/showthread.php?t=561030)
|
|---|
引用:
92年 交大科管所 碩士考題.. :stupefy: 先不管那個K=K+1囉 我比較好奇的是 這行印出ans=Q(L); printf("%3d%3d%3d\n",ans,K,L); 而是使用call by reference的下面程式碼 long Q(long& X){ long K; L=X+1; K=K+1 return L+(X++); 同學A說: X的記憶體空間應該跟L使用相同一個 而(X++)先被執行..所以X+1之後把值回寫到記憶體中. 但因為X與L使用相同記憶體空間.所以L+X=8.回傳給ans=8 同學B說: L先取得L=X+1的值.因此L的空間裡面的值為2+1=3 然後在執行X++.此時X與L使用相同記憶體空間.因此X=4 所以L+X為7 究竟是哪個正確呢????? :confused: |
推一下推一下
:p :p :p |
基本上我覺得同學B只是在湊答案或是敷衍你...
正常來說答案應該是8.... 不過問題的核心就在於「X++的結果是否有寫回記憶體中」 如果「有」則答案會是8 如果「沒有」則答案會是7 取決於Compiler怎麼編譯的... 如果L+(X++);被編譯後成為: X=X+1; ans=L+X; 那答案應該會是8...因為X++的計算結果已被回寫至記憶體 如果L+(X++);被編譯後成為: ans=L+X+1; 那答案應該會是7...因為X++計算結果並沒有回寫至記憶體 PS.以上編譯後的程式為方便理解的舉例...實際結果請參考編譯器的編譯結果 引用:
|
引用:
你有沒有C++ Compiler?實作一次就知道了。理論說再多都是屁,你用的編 譯器怎麼搞,你就得乖乖摸著鼻子接受... 我就吃過這樣的虧,在我的編譯器上,return X++其實是return X之後才把 X++... |
引用:
手邊沒有C++編譯器...只好沙盤推演 :ase int x=1; printf("%d\n",X++)是先印出X,然後再把X+1 printf("%d\n",++X)是先把X+1,再把X印出 書上是這樣子寫的... 感謝各位大大回應..繼續加油囉 |
引用:
剛把上面那段程式碼丟進c++跑過了一次 排除掉一些錯誤後 把k全部改小寫(不改跑不了,原題目就是這樣子嗎) 答案是 3 2 1 3 3 1 7 4 4 10 4 6 不過這一題跟前後置運算沒關係,題目有加括號囉 至於return x++; 會先 return x再++跟compiler 應該沒關係 這是後置運算 本來就會先 把x return 再++ |
引用:
感謝這位大大願意花實驗.. 我想會不會是打考卷(題目)的人打錯了..以致於我們算不出來 :ase |
這個答案是錯誤的 :stupefy:
我用 gcc 跑出來是 3 2 1 3 3 1 7 4 4 10 4 6 我來解釋一下好了,為了解釋方便,我會加註每個變數的 scope 如 global::K, global::L 這兩個是全域變數,Q::K 則是 Q()裡面的K 1 #include<studio.h> 2 long K,L; 3 long P(long X){ 4 long L; L=X+1; K=K+1 5 return L+(X++); 6 } 7 long Q(long& X){ 8 long K; L=X+1; K=K+1 9 return L+(X++); 10 } 11 int main(){ 12 int ans;k=1;L=1; 13 ans=P(K); printf("%3d%3d%3d\n",ans,K,L); 14 ans=P(L); printf("%3d%3d%3d\n",ans,K,L); 15 ans=Q(K); printf("%3d%3d%3d\n",ans,K,L); 16 ans=Q(L); printf("%3d%3d%3d\n",ans,K,L); 17 } 12 global::K=1; global::L=1 13 呼叫P(K),由於是 call by value,所以 P::X 只是值等於 global::K,也就是 1 4 P::L=P::X+1=2; global::K=global::K+1=2; 5 return (P::L+P::X)=3 13 ans=3 global::K=2 global::L=1 14 呼叫P(L),由於是 call by value,所以 P::X 只是值等於 global::L,也就是 1 4 P::L=P::X+1=2; global::K=global::K+1=3; 5 return (P::L+P::X)=3 14 ans=3 global::K=3 global::L=1 15 呼叫Q(K),由於是 call by reference,Q::X 的記憶體位址和 global::K 是一樣的 (以下我就直接把Q::X代換成global::K了) 8 global::L=global::K+1=4; Q::K=Q::K+1=1 9 return (global::L+global::K)=7; (global::K++)=4 15 ans=7 global::K=4 global::L=4 16 呼叫Q(K),由於是 call by reference,Q::X 的記憶體位址和 global::L 是一樣的 (以下我就直接把Q::X代換成global::L了) 8 global::L=global::L+1=5; Q::K=Q::K+1=1 9 return (global::L+global::L)=10; (global::L++)=6 16 ans=10 global::K=4 global::L=6 希望有人看得懂 :cool: |
引用:
不是全部改小寫,而是因為main裡面的k被打成小寫了,我改那裡就ok,而且我跑 出來的答案跟你的一樣,所以我覺得這題目根本就有問題,例如P函式裡面對於宣告 但沒有設定初值的變數K進行運算,我就覺得是一件很不應該的事情... 我實驗的結果return L+(X++)也是先return L+(X)後才進行X++的。 |
引用:
真的是這樣捏:stupefy::stupefy:歹勢:agree::agree: 為什麼這裡的括號會被視若無物阿....Orz |
| 所有的時間均為GMT +8。 現在的時間是06:16 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。