PCDVD數位科技討論區

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)

m5a8258 2005-11-19 10:46 AM

引用:
作者isamuplus
P函式宣告了一個新的Long L,表示函式內的這個L和函式外的L並不是同一個
變數,所以當L = X + 1的時候,函式內的L就被初始化而有值。

但是Q函式裡面宣告了一個新的Long K,沒給初值而且又有K=K+1這種運算敘
述,到底是哪個天才寫出來的程式...?


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:

m5a8258 2005-11-19 11:58 AM

推一下推一下
:p :p :p

傳說 2005-11-19 01:05 PM

基本上我覺得同學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.以上編譯後的程式為方便理解的舉例...實際結果請參考編譯器的編譯結果

引用:
作者m5a8258
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:

isamuplus 2005-11-19 01:07 PM

引用:
作者m5a8258
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:


你有沒有C++ Compiler?實作一次就知道了。理論說再多都是屁,你用的編
譯器怎麼搞,你就得乖乖摸著鼻子接受...

我就吃過這樣的虧,在我的編譯器上,return X++其實是return X之後才把
X++...

m5a8258 2005-11-19 01:22 PM

引用:
作者isamuplus
你有沒有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印出
書上是這樣子寫的...
感謝各位大大回應..繼續加油囉

b9156032 2005-11-19 01:28 PM

引用:
作者m5a8258
手邊沒有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 再++

m5a8258 2005-11-19 01:32 PM

引用:
作者b9156032
剛把上面那段程式碼丟進c++跑過了一次 排除掉一些錯誤後
把k全部改小寫(不改跑不了,原題目就是這樣子嗎)
答案是
3 2 1
3 3 1
7 4 4
10 4 6
不過這一題跟前後置運算沒關係,題目有加括號囉
至於return x++; 會先 return x再++跟compiler 應該沒關係
這是後置運算 本來就會先 把x return 再++


感謝這位大大願意花實驗..
我想會不會是打考卷(題目)的人打錯了..以致於我們算不出來 :ase

capitalm 2005-11-19 01:41 PM

這個答案是錯誤的 :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:

isamuplus 2005-11-19 01:42 PM

引用:
作者b9156032
剛把上面那段程式碼丟進c++跑過了一次 排除掉一些錯誤後
把k全部改小寫(不改跑不了,原題目就是這樣子嗎)
答案是
3 2 1
3 3 1
7 4 4
10 4 6
不過這一題跟前後置運算沒關係,題目有加括號囉
至於return x++; 會先 return x再++跟compiler 應該沒關係
這是後置運算 本來就會先 把x return 再++


不是全部改小寫,而是因為main裡面的k被打成小寫了,我改那裡就ok,而且我跑
出來的答案跟你的一樣,所以我覺得這題目根本就有問題,例如P函式裡面對於宣告
但沒有設定初值的變數K進行運算,我就覺得是一件很不應該的事情...

我實驗的結果return L+(X++)也是先return L+(X)後才進行X++的。

b9156032 2005-11-19 01:56 PM

引用:
作者isamuplus

我實驗的結果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。