2017-02-25 5 views
0

In dem Code-Schnipsel unten möchte ich eine sehr einfache Berechnung d = a + b + c; a, b, c = b, c, d machen. Es iteriert mehrmals.Weird Verhalten von big.NewInt anonyme Variable

Im ersten Versuch, ich mache eine anonyme Variable big.NewInt(0).Add(a, b) das Ergebnis a + b, dann fügen Sie es zu bekommen und c das Endergebnis a + b + c zu bekommen. Aber von der zweiten Iteration, d.Add(big.NewInt(0).Add(a, b), c) änderte den Wert von c, dann b, dann a, und natürlich ist das Endergebnis falsch.

Allerdings gab mir die Methode des zweiten Versuchs die richtige Antwort. Kann mir bitte jemand sagen warum?

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) 
} 

Antwort

0

math/big.NewInt gibt einen Zeiger zu einem Int, so nach dem ersten Iteration, die beide c und d Punkt zum gleichen Objekt. Dies bedeutet, dass in der zweiten Iteration, wenn Sie etwas zu d hinzufügen, die gleiche Änderung in c widergespiegelt wird. Dann kopieren Sie c zu b, so dass b auch auf das gleiche Objekt zeigt, und auf die nächste Iteration b zu a, so nach der dritten Iteration, zeigen alle 4 Variablen auf die gleiche Int.

Ihre zweite Schleife funktioniert, weil Sie einen neuen Int für d jedes Mal erstellen, so dass Sie jedes Mal, wenn die Zeiger verschieben, ein neueInt (derjenige, der für d erstellt wurde) zu c bewegt wird, dann b, dann zu a.

+0

Ich habe es. Danke vielmals. – Alexander