2017-02-25 47 views
0

在下面的代码片段中,我想做一个非常简单的计算d = a + b + c; a, b, c = b, c, d。它迭代几次。big.NewInt匿名变量的怪异行为

在第一次尝试,我做一个匿名变量big.NewInt(0).Add(a, b)得到的a + b的结果,然后将其添加和c得到的a + b + c最终结果。但从第二次迭代中,d.Add(big.NewInt(0).Add(a, b), c)更改为c,然后b,然后a的值,当然最后的结果是错误的。

但是,第二次尝试的方法给了我正确的答案。有谁能告诉我为什么,请吗?

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返回一个指针Int,所以你的第一个循环之后,双方cd指向相同对象。这意味着,在第二次迭代中,当您向d添加内容时,相同的更改将反映在c中。然后你将c复制到b,所以b也会指向同一个对象,并且在下一次迭代ba之后,所以在第三次迭代之后,所有4个变量指向相同的Int

你的第二个循环的作品,因为你创建一个新的Intd每一次,所以每次移动指针,一个Int(这是为d创建的)被转移到c,然后b,然后到a

+0

我明白了。非常感谢。 – Alexander