写点什么

2022-10-08:以下 go 语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。 package main const s = “Go101.org“ // len(s) == 9

  • 2022 年 10 月 08 日
    北京
  • 本文字数:505 字

    阅读完需:约 2 分钟

2022-10-08:以下go语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。 package main const s = “Go101.org“ // len(s) == 9

2022-10-08:以下 go 语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。


package main
const s = "Go101.org"// len(s) == 9// 1 << 9 == 512// 512 / 128 == 4
var a byte = 1 << len(s) / 128var b byte = 1 << len(s[:]) / 128
func main() { println(a, b)}
复制代码


答案选 C。这道题有人选 D,也有人选 A,但答案总是出乎意料。1.对于移位操作,x<<y,数据类型是根据 x 确定。x 是 byte 类型,那么整个表达式也是 byte 类型,跟 y 无关。所以 var b byte = 1 << len(s[:]) / 128,左移 9 位,已经溢出了,结果是 0。2.var a byte = 1 << len(s) / 128 中,1 << len(s) / 128 在编译期间就计算好了。这个可以根据返汇编一探究竟。输入命令 go tool compile -S main2.go,如下可见,a 在 data 段,b 在 bss 段,a 的值已经在文件中确定了。总结:这道题非常考细节,考的是移位操作和编译优化两个细节。


"".a SNOPTRDATA size=1        0x0000 04                                                     0x0000 01 00 00 00 00 00 00 00                          ........  ."".b SNOPTRBSS size=1gclocals·33cdeccccebe80329f1fdbee7f5874cb SRODATA dupok size=8        0x0000 01 00 00 00 00 00 00 00
复制代码




发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2021.02.15 加入

还未添加个人简介

评论

发布
暂无评论
2022-10-08:以下go语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。 package main const s = “Go101.org“ // len(s) == 9_golang_福大大架构师每日一题_InfoQ写作社区