![]() |
||
|
Major Member
![]() 加入日期: Apr 2001 您的住址: 藍色星球
文章: 223
|
引用:
92年 交大科管所 碩士考題.. ![]() 先不管那個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 究竟是哪個正確呢????? ![]() 此文章於 2005-11-19 11:57 AM 被 m5a8258 編輯. |
||||||||
|
|
|
Major Member
![]() 加入日期: Apr 2001 您的住址: 藍色星球
文章: 223
|
推一下推一下
![]() |
||
|
|
|
Amateur Member
![]() 加入日期: Jun 2002 您的住址: 太陽系
文章: 32
|
基本上我覺得同學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.以上編譯後的程式為方便理解的舉例...實際結果請參考編譯器的編譯結果 引用:
__________________
PCDVD站長:擋廣吿的後果就是導致免費網站無以為繼! 在你享受自由網路的同時 自私的行為只會扼殺這個環境。 |
|
|
|
|
Junior Member
![]() ![]() ![]() 加入日期: Aug 2004
文章: 883
|
引用:
你有沒有C++ Compiler?實作一次就知道了。理論說再多都是屁,你用的編 譯器怎麼搞,你就得乖乖摸著鼻子接受... 我就吃過這樣的虧,在我的編譯器上,return X++其實是return X之後才把 X++... |
|
|
|
|
Major Member
![]() 加入日期: Apr 2001 您的住址: 藍色星球
文章: 223
|
引用:
手邊沒有C++編譯器...只好沙盤推演 int x=1; printf("%d\n",X++)是先印出X,然後再把X+1 printf("%d\n",++X)是先把X+1,再把X印出 書上是這樣子寫的... 感謝各位大大回應..繼續加油囉 |
|
|
|
|
Basic Member
加入日期: Feb 2004
文章: 10
|
引用:
剛把上面那段程式碼丟進c++跑過了一次 排除掉一些錯誤後 把k全部改小寫(不改跑不了,原題目就是這樣子嗎) 答案是 3 2 1 3 3 1 7 4 4 10 4 6 不過這一題跟前後置運算沒關係,題目有加括號囉 至於return x++; 會先 return x再++跟compiler 應該沒關係 這是後置運算 本來就會先 把x return 再++ |
|
|
|
|
Major Member
![]() 加入日期: Apr 2001 您的住址: 藍色星球
文章: 223
|
引用:
感謝這位大大願意花實驗.. 我想會不會是打考卷(題目)的人打錯了..以致於我們算不出來 ![]() |
|
|
|
|
Major Member
![]() 加入日期: Jun 2003 您的住址: where the light is
文章: 271
|
這個答案是錯誤的
我用 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 希望有人看得懂 ![]() 此文章於 2005-11-19 02:04 PM 被 capitalm 編輯. |
|
|
|
Junior Member
![]() ![]() ![]() 加入日期: Aug 2004
文章: 883
|
引用:
不是全部改小寫,而是因為main裡面的k被打成小寫了,我改那裡就ok,而且我跑 出來的答案跟你的一樣,所以我覺得這題目根本就有問題,例如P函式裡面對於宣告 但沒有設定初值的變數K進行運算,我就覺得是一件很不應該的事情... 我實驗的結果return L+(X++)也是先return L+(X)後才進行X++的。 |
|
|
|
|
Basic Member
加入日期: Feb 2004
文章: 10
|
引用:
真的是這樣捏 ![]() 歹勢![]() ![]() 為什麼這裡的括號會被視若無物阿....Orz |
|
|
|