首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >速记返回

速记返回
EN

Stack Overflow用户
提问于 2016-09-01 20:34:31
回答 2查看 2.3K关注 0票数 1

以下代码在Go 1.6或1.7中生成语法错误(语句结尾处的意外++ ):

代码语言:javascript
复制
package main

import "fmt"

var x int

func increment() int {
        return x++   // not allowed
}

func main() {
  fmt.Println( increment() )
}

难道不应该允许这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-01 20:37:33

这是一个错误,因为Go中的++--是语句,而不是表达式:规范: IncDec语句 (和语句没有返回的结果)。

有关推理,请参见Go FAQ:为什么++和--语句而不是表达式?为什么是后缀而不是前缀?

没有指针算法,前置和后缀增量运算符的方便值就会下降.通过将它们从表达式层次结构中完全删除,表达式语法得到简化,并且消除了++和-(考虑f(i++)和pi = q++i)的计算顺序的杂乱问题。简化是非常重要的。至于后缀和前缀,两者都很好,但后缀版本更传统;对前缀的坚持出现在STL中,这是一种语言库,具有讽刺意味的是,它的名称包含一个后缀增量。

因此,您编写的代码只能编写为:

代码语言:javascript
复制
func increment() int {
    x++
    return x
}

你必须叫它而不传递任何东西:

代码语言:javascript
复制
fmt.Println(increment())

请注意,我们仍然会尝试使用赋值将其写成一行,例如:

代码语言:javascript
复制
func increment() int {
    return x += 1 // Compile-time error!
}

但是这在Go中也不起作用,因为分配也是一条语句,因此您得到了编译时错误:

语法错误:语句结尾处的意外+=

票数 8
EN

Stack Overflow用户

发布于 2020-07-16 16:12:07

可接受的解决方案是正确的,OP的代码不能工作,因为在go增量/递减(x++/x-)语句中,表达式不返回值。

但是,所提供的解决方案的效果与最初的请求略有不同。

x++将返回x的值,然后以类似C的语法递增。

然而,如果你这样做,则会发生相反的情况:

代码语言:javascript
复制
x++
return x

您可以通过将初始值减少一个或使用如下所写的延迟语句来否定此问题:

代码语言:javascript
复制
func incr() int {
    defer func() { counter++ }()
    return counter
}

https://play.golang.org/p/rOuAv7KFJQw

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39280447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档