Go Quizzes 101 (2)

less than 1 minute read

题目

查看原题

Play

package main

var n int = 5

func main() {
	// 10 << 5 <=> 10 * 32
	var x = byte(10 << n / 10)
	var w = 10 << n
	var y = byte(w / 10)
	var z = byte(w) / 10
	println(x, y, z)
}

分析

这道测验题考察点和上一篇差不多。 n 是类型确定的变量, 根据:

如果左操作数是一个类型不确定值并且右操作数是一个非常量,则左操作数将被首先转化为运算结果的期待设想类型。

所以:

var x = byte(10 << n / 10)

等价于

var x = byte(byte(10) << n / 10)

byte(10) << n (截断前)结果为 320,二进制表示是 1 0100 0000,截断后为 0100 0000,即 64。所以 x=6

根据:

如果期待设想类型并没有被指定,则左操作数的默认类型将被视为它的期待设想类型。

所以

var w = 10 << n

等价于

var w = int(10) << n

则运算结果是,w 值为320,且为类型确定值,类型是 int

根据:

如果左操作数是一个类型确定值(则它的类型必定为整数),则此移位运算的结果也是一个和左操作数类型相同的类型确定值。

所以

var y = byte(w / 10)

等价于

var y = byte(int(32))

y=32

而对于

var z = byte(w) / 10

表达式来说,byte(w) 会被截断为 64, 故 z=6

综上,这道题的最终结果为 6 32 6

Comments