【问题标题】:Precedence of index expression and pointer dereference expression索引表达式和指针取消引用表达式的优先级
【发布时间】:2017-12-25 07:23:16
【问题描述】:

给定一个简单的表达式,如

*a[0]

其中a 被声明为*[]string(指向字符串切片的指针)。

标准在哪里准确解释了语言结构的评估顺序?

我发现它们实际上都不是一个运算符,并且在规范中提到的 precedence 关键字只有几处提及:

  1. https://golang.org/ref/spec#Notation
  2. https://golang.org/ref/spec#Operators

那么,规范的哪一部分会解释所提供表达式的求值顺序?

【问题讨论】:

标签: go


【解决方案1】:

最终部分是Primary Expressions

主表达式是一元和二元表达式的操作数。

它继续定义主表达式,但基本上,这包括切片表达式,这意味着切片表达式a[0] 是一元运算符* 的操作数。为指向数组的指针做了一个特例(见下文)。

根据Address Operators

对于类型为 T 的操作数 x,地址操作 &x 生成指向 x 的 *T 类型的指针。操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是(可能带括号的)复合文字。如果 x 的评估会导致运行时恐慌,那么 &x 的评估也会。

对于指针类型*T的操作数x,指针间接*x表示x指向的类型T的变量。如果 x 为 nil,则尝试评估 *x 将导致运行时恐慌。

暗示,但没有明确说明,指针间接运算符右侧的切片索引表达式或字段选择器表达式在计算间接之前作为一个整体进行计算。

另外,指针间接(*x一个运算符,特别是Address Operator。切片索引引用不是一个运算符,而是一个Index Expression

还要注意:

对于指向数组类型的指针:

a[x](*a)[x] 的简写

虽然指向切片类型的指针不能这样说。

【讨论】:

  • 这里的相关语法是针对Unary Expression——一元运算符适用于其右边的表达式,而不是第一个标识符。
  • 正如规范所说,它适用于数组:play.golang.org/p/y898H_klZq,但奇怪的是它不适用于指向切片的指针。
  • 好的,这是我能想到的最好的了。规范对此真的不清楚,并在许多不同的部分提供了一些零碎的内容。
  • 我们应该发布到 go 邮件列表并投诉 ;)
  • 切片和数组出现偏差的原因可以在这个答案中找到:Slicing a slice pointer passed as argument
猜你喜欢
  • 2020-07-05
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2020-06-23
  • 2011-02-13
  • 2011-07-24
  • 2021-10-04
相关资源
最近更新 更多