Go Quizzes 101 (1)

less than 1 minute read

题目

查看原题

Play

package main

var n uint = 10

const N uint = 10

func main() {
	var x1 byte = (1 << n) / 100
	var y1 int16 = (1 << n) / 100
	var x2 byte = (1 << N) / 100
	var y2 int16 = (1 << N) / 100
	println(x1, y1, x2, y2)
}

分析

这道测验题主要考察的知识点在常量和变量运算操作符这两小节中。

var x1 byte = (1 << n) / 100
var y1 int16 = (1 << n) / 100

n 是变量,且为类型确定值,类型是 uint,根据移位运算规则:

如果左操作数是一个类型不确定值并且右操作数是一个非常量,则左操作数将被首先转化为运算结果的期待设想类型。 如果期待设想类型并没有被指定,则左操作数的默认类型将被视为它的期待设想类型。 如果此期待设想类型不是一个基本整数类型,则编译报错。 当然最终运算结果是一个类型为此期待设想类型的类型确定值。

所以等价于:

var x1 = (byte(1) << n) / 100
var y1 = (int16(1) << n) / 100

第一行中,byte(1) << n 会被截断为 0, 所以 x1=0。 第二行中,int16(1) << n 结果为 1024,除以 100 后为 10,所以 y1=10

var x2 byte = (1 << N) / 100
var y2 int16 = (1 << N) / 100

N 是常量,且为类型确定值,类型是 uint,根据移位运算规则:

如果左操作数是一个类型不确定值并且右操作数是一个常量,则左操作数将总是被视为一个整数。 如果它的默认类型不是一个整数(rune或int),则它的默认类型将被视为int。 此移位运算的结果也是一个类型不确定值并且它的默认类型和左操作数的默认类型一致。

所以等价于:

var x2 = byte(int(1) << N) / 100)
var y2 = int16(int(1) << N) / 100)

因为 int(1) << N) / 100 的运算结果为 10,所以 x2=10, y2=10

这道题的最终结果为 0 10 10 10

Comments