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。
复制代码
答案选 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 的值已经在文件中确定了。总结:这道题非常考细节,考的是移位操作和编译优化两个细节。
复制代码
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/8544f48bd535b84c323f880ad】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论