我在here浏览ast.go的Go源代码,有3种类型的接口,分别是Expression,Statement和Declaration。但只有源代码我无法弄清楚它们之间的区别。我能想出的是表达式导致一个对象可以被分配或比较或用作参数,而语句是一些流控制,如果-else或for循环。 但我发现了一些像
这样的定义 // An IncDecStmt node represents an increment or decrement statement.
IncDecStmt struct {
X Expr
TokPos token.Pos // position of Tok
Tok token.Token // INC or DEC
}
它不应该是一个表达吗?我对如何区分表达式和语句感到困惑,是否有任何规则?
答案 0 :(得分:7)
Golang spec使用这些条款:
IncDecStmt
指定为
IncDecStmt = Expression ( "++" | "--" ) .
“++”和“ - ”语句通过无类型常量1递增或递减其操作数。
它使用表达式,但仍然是一个语句(不产生新值)。
答案 1 :(得分:5)
这些是CS中的常用术语。表达式生成一个值,而一个语句通常不会(这个最后一个点取决于语言,事实上,某些语言将表达式视为语句的子类别)。
来自Wikipedia:
在大多数语言中,语句与表达式形成鲜明对比 语句不返回结果,仅为其执行 副作用,而表达式总是返回结果并经常这样做 根本没有副作用。
在Go an expression may be used as statement。
你的困惑似乎来自增量和减量运算符。在Go中,与大多数基于C的语言相反,the increment and decrement statements don't produce a value, they're statements and not expressions。也就是说,你可能不会写
b := a++