Go 鲜为人知的角落|第 4 章 运算符|《Darker Corners of Go》独译(已授权)

178 阅读1分钟

当前译本仍不稳定,如翻译有问题请及时联系 jacob953@csu.edu.cn

运算符优先级

Go的运算符优先级与其他语言不同:

优先级        运算符
5            *, /, %, <<, >>, &, &^
4            +, -, |, ^
3            ==, !=, <, <=, >, >=
2            &&
1            ||

与 C 语言进行比较:

Precedence   Operator
10           *, /, %
9            +, -
8            <<, >>
7            <, <=, >, >=
6            ==, !=
5            &
4            ^
3            |
2            &&
1            ||

对于同一表达式,可能会产生不同结果:

In Go: 1 << 1 + 1 // (1<<1)+1 = 3
In C:  1 << 1 + 1 // 1<<(1+1) = 4

自增与自减

Go 与许多其他语言不同,没有前缀自增或自减运算符:

var i int
++i // 语法错误: 不期望 ++, 期望 }
--i // 语法错误: 不期望 --, 期望 }

虽然 Go 有这些运算符的后缀版本,但不允许在表达式中使用:

slice := []int{1,2,3}
i := 1
slice[i++] = 0 // 语法错误: 不期望 ++, 期望:

三目运算符

Go 不支持三目运算符:

result := a ? b : c

在 Go 中这是不存在的,放弃吧。你必须使用 if-else 来代替三目运算符。 Go 语言的设计者认为这个运算符往往会导致难看的代码,最好不要有它。

按位非

在 Go 中,XOR 运算符 ^ 被用作一元 NOT 运算符,而不是像许多其他语言使用 ~ 符号。

In Go: ^1 // -2
In C:  ~1 // -2

二元 XOR 运算符仍被用作 XOR 运算符(异或)使用。

3^1 // 2