【问题标题】:golang - Why ++ and -- not work in expressions?golang - 为什么 ++ 和 -- 在表达式中不起作用?
【发布时间】:2014-07-15 20:23:09
【问题描述】:

我们在其他语言中认为理所当然并且几乎期望它可以在 go 中工作,但不会工作 - 这样做几乎很自然,那么为什么编译器不高兴呢?只是感觉有时想摆脱困境。

增加值的唯一方法是将其放在单独的行中?

http://play.golang.org/p/_UnpZVSN9n

package main

import "fmt"
import "strconv"

func main() {
    a := 1
    //Evaluate expression and pass into function - won't work
    fmt.Println(strconv.Itoa(a++))
    //Braces around a++ also won't work
    fmt.Println(strconv.Itoa((a++)))
}

【问题讨论】:

标签: go


【解决方案1】:

++-- 是 golang 中的语句,而不是表达式

【讨论】:

  • 皇家痛苦!我以前到处都使用过前缀/后缀,很多人都习惯了。对于人们已经习惯了几十年的事情,我没有看到任何混淆。
  • 来自常见问题解答(由上面的@ismail-badawi 链接):“至于后缀与前缀,两者都可以正常工作,但后缀版本更传统;对前缀的坚持源于 STL,一个具有讽刺意味的是,它的名称包含后缀增量的语言的库。”
  • 如果某件事只是因为大多数开发人员习惯了它才可以,那么它就不行了。新开发人员不必学习数十年的生硬知识才能赶上。
  • @semi 老实说,如果这是论点,他们最好完全放弃 ++ 和 -- 。目前的形式对新开发者来说并没有好多少,对于老狗来说绝对是一种痛苦。
【解决方案2】:

具体来说,++-- 是语句,因为当它们在表达式中时,很难理解它们的计算顺序。

考虑以下几点:

// This is not valid Go!
x := 1
x = x++ + x
y := 1
y = ++y + y

您希望x 是什么?你希望y 是什么?相比之下,当这是一个语句时,评估的顺序非常明确。

【讨论】:

    【解决方案3】:

    为了帮助澄清,表达式中包含 =:=+=。声明(例如++)不会。见https://stackoverflow.com/a/1720029/12817546

    package main
    
    import "fmt"
    
    var x int
    
    func f(x int) {
        x = x + 1      //expression
        x++            //statement
        fmt.Println(x) //2
    }
    
    func main() {
        f(x) //expression statement
    }
    

    “表达式”通过将运算符和函数应用于操作数来指定值的计算。见https://golang.org/ref/spec#Expressions

    “语句”控制执行。见https://golang.org/ref/spec#Statements

    “表达式语句”是出现在语句中的函数和方法调用或接收操作。见https://golang.org/ref/spec#Expression_statements

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 2014-06-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多