我在这里浏览 ast.go 的 Go 源代码,有 3 种类型的接口,即表达式、语句和声明。但仅凭源代码我无法弄清楚它们之间的区别。 我能弄清楚的是表达式导致一个可以分配或比较或用作参数的对象,而语句是一些像 if-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 }不应该是表达式吗?我很困惑如何区分表达式和语句,有什么规则吗?
2 回答
哈士奇WWW
TA贡献1799条经验 获得超6个赞
该Golang规范使用这些术语:
表达式:通过将运算符和函数应用于操作数来指定值的计算。
语句:控制执行
声明(和范围):将非空标识符绑定到常量、类型、变量、函数、标签或包
在IncDecStmt
被指定为
IncDecStmt = Expression ( "++" | "--" ) .
"++" 和 "--" 语句通过无类型常量 1 递增或递减它们的操作数。
它使用一个表达式,但仍然是一个语句(不产生新值)。
注意:无类型常量是当你声明一个常量而不明确提及它的类型时:
i := 0 # int8? uint8? int16? ...
无类型常量具有默认类型,该类型是在需要类型值的上下文中将常量隐式转换为的类型,例如,在没有显式类型的短变量声明中。
一个无类型恒定的默认类型是
bool
,rune
,int
,float64
,complex128
或string
分别,这取决于它是否是一个布尔值,符,整数,浮点,复杂,或字符串常量。
神不在的星期二
TA贡献1963条经验 获得超6个赞
这些是CS中的常用术语。一个表达式产生一个值,而一个语句通常不会产生一个值(最后一点取决于语言,事实上,一些语言将表达式视为语句的一个子类别)。
来自维基百科:
在大多数语言中,语句与表达式的对比在于,语句不返回结果并且仅因其副作用而执行,而表达式总是返回结果并且通常根本没有副作用。
在 Go 中,表达式可以用作语句。
您的困惑似乎来自递增和递减运算符。在 Go 中,与大多数基于 C 的语言相反,增量和减量语句不产生值,它们是语句而不是表达式。也就是说,你可能不会写
- 2 回答
- 0 关注
- 369 浏览
添加回答
举报
0/150
提交
取消