2017-02-25 3 views
0

以下のコードスニペットで、私は非常に簡単な計算をしたいと考えていますd = a + b + c; a, b, c = b, c, d。数回繰り返します。最初の試みでbig.NewInt匿名変数の奇妙な振る舞い

、私はその後a + b + cの最終的な結果を得るためにそれとcを追加し、a + bの結果を得るために、匿名の変数big.NewInt(0).Add(a, b)を作ります。しかし、2回目の反復では、d.Add(big.NewInt(0).Add(a, b), c)cの値を変更した後、b、次にaとなり、最終結果は間違っています。

しかし、2回目の試行では正しい答えが得られました。誰も私になぜ、教えてもらえますか?

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    // first try 
    a := big.NewInt(1) 
    b := big.NewInt(2) 
    c := big.NewInt(3) 
    d := big.NewInt(0) 
    for i := 0; i < 5; i++ { 
     // d = a + b + c 
     d.Add(big.NewInt(0).Add(a, b), c) 
     fmt.Println(a, b, c, d) 
     // a <- b, b <- c, c <- d 
     a, b, c = b, c, d 
     fmt.Println(a, b, c, d) 
    } 
    fmt.Println(d) 

    // second try 
    a = big.NewInt(1) 
    b = big.NewInt(2) 
    c = big.NewInt(3) 
    d = big.NewInt(0) 
    for i := 0; i < 5; i++ { 
     // d = a + b + c 
     d = big.NewInt(0).Add(big.NewInt(0).Add(a, b), c) 
     fmt.Println(a, b, c, d) 
     // a <- b, b <- c, c <- d 
     a, b, c = b, c, d 
     fmt.Println(a, b, c, d) 
    } 

    fmt.Println(d) 
} 

答えて

0

math/big.NewInt、最初の反復後に、同じオブジェクトにcd点の両方をIntからポインタを返します。つまり、2回目の繰り返しで、dに何かを追加すると、同じ変更がcに反映されます。次にcbにコピーします。したがって、bは同じオブジェクトを指し、次の反復ではbからaになるため、3回目の反復後、4つの変数すべてが同じIntを指します。

あなたが dのための新しい Intを毎回作成するためにあなたの第二のループが動作する

、あなたはポインタをシフトするので、毎回、新しいIntdのために作成されたもの)は、その後、bに、cに移動します次にaになります。

+0

私はそれを得ました。どうもありがとう。 – Alexander