douqie1884 2019-04-28 07:19
浏览 110

变量初始化有错误吗

as the spec of golang, I try to write test code. as the spec says, the init order is d,b,c,a, I think the b should be 4 and c should be 5, but I got b == 5 and c == 4 is there something wrong? or I misunderstand the spec?

I tried in go version as below

go version go1.12.4 linux/amd64
package main

import "fmt"

var (
    a = c + b
    b = f()
    c = f()
    d = 3
)

func f() int {
    d++
    return d
}

func main() {
    fmt.Println("a", a)
    fmt.Println("b", b)
    fmt.Println("c", c)
    fmt.Println("d", d)
}

the result is

result:
a 9
b 5
c 4
d 5

expect b = 4, c = 5

  • 写回答

1条回答 默认 最新

  • douhu2890 2019-04-28 07:44
    关注

    no, as you said yourself it does d,c,b,a

    so d is 3

    then c calls f() and d is 4, therefore c is 4

    next b calls f() and d is 5, therefore b is 5

    finally, a is c+b or 9

    and d has ended up as 5 due to side effects in f()

    Here's compiler output of the relevant section

    As you can see it sets c( c(SB) ), then b, then a

      0x004b 00075 (b2.go:6)  CALL  "".f(SB)
      0x0050 00080 (b2.go:6)  MOVQ  (SP), AX
      0x0054 00084 (b2.go:6)  MOVQ  AX, "".c(SB)
      0x005b 00091 (b2.go:5)  CALL  "".f(SB)
      0x0060 00096 (b2.go:5)  MOVQ  (SP), AX
      0x0064 00100 (b2.go:5)  MOVQ  AX, "".b(SB)
      0x006b 00107 (b2.go:4)  MOVQ  "".c(SB), CX
      0x0072 00114 (b2.go:4)  ADDQ  CX, AX
      0x0075 00117 (b2.go:4)  MOVQ  AX, "".a(SB)
    

    ( to generate this output I used go tool compile -S -N abcd.go > abcd.s The actual code line numbering is from a slightly simplified version with the fmt import and print statements removed )

    this is with go version go1.11.4 linux/amd64

    Tried the same with go version go1.12.4 linux/amd64, with the same result

    评论

报告相同问题?

悬赏问题

  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿