龙空技术网

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

福大大架构师每日一题 153

前言:

如今小伙伴们对“c语言d什么意思啊”大约比较注重,朋友们都想要分析一些“c语言d什么意思啊”的相关内容。那么小编在网络上网罗了一些关于“c语言d什么意思啊””的相关知识,希望我们能喜欢,兄弟们快快来了解一下吧!

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

package mainconst s = "Go101.org"// len(s) == 9// 1 << 9 == 512// 512 / 128 == 4var a byte = 1 << len(s) / 128var b byte = 1 << len(s[:]) / 128func 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

答案选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的值已经在文件中确定了。

总结:这道题非常考细节,考的是移位操作和编译优化两个细节。

标签: #c语言d什么意思啊