2013-12-20 20 views
3

我瞭解通過複製恢復調用的基本邏輯。但是我想知道的一個問題是這樣特殊情況下通過複製恢復調用混淆

void p(int x,int y) { 
    x++; 
    y+=2; 
} 

main() { 
    int a=10; 
    p(a,a); 
    // what will be now value of a, 11 or 12? 
} 
+0

你試過運行過嗎?這應該是C或其他什麼?在C中,'a'的值將是10(假設'= ++'打算成爲'++'),但我不確定我清楚你的問題。特別是,'x = ++'意圖是什麼? 'X ++'? – asm

+0

這是什麼語言?它似乎代碼不編譯。 「x = ++」? –

+0

我不是在說這裏的任何語言,我只是想通過複製恢復方法來調用。 – alienCoder

回答

4

更新:答案是12,請參見下面更新。

好的,這實際上是一個很好的問題。因此,這解釋了「複製恢復」的全部內容:https://stackoverflow.com/a/8871340/171933

大多數編程語言不支持複製/恢復,但僅支持傳遞值和傳遞引用(一些變體)。因此,嘗試一下並不容易。

但是,您感興趣的問題是:哪個值勝? x是否在函數結束時(它將爲11)將其值寫回a,或者當函數結束時(也就是12),y會將其值寫回a

在支持「複製恢復」的語言中,我希望這會引發編譯器錯誤。

更新

經過一番搜索,我發現居然還支持「複製 - 恢復」,即Ada的語言。這是艾達的代碼(這是我寫的第一阿達,可能最後一個節目):

with Ada.Text_IO; use Ada.Text_IO; 

procedure copy_restore_example is 
     a: integer; 

     procedure p(x: in out integer; y: in out integer) is 
     begin 
       x:= x+1; 
       y:= y+2; 
     end p; 

begin 
     a := 10; 
     Put_Line("Before :" & natural'image(a)); 
     p(a, a); 
     Put_Line("After :" & natural'image(a)); 

end copy_restore_example; 

結果是,y勝。你可以在你的瀏覽器中運行這個程序:http://www.compileonline.com/compile_ada_online.php