为了账号安全,请及时绑定邮箱和手机立即绑定

从编译器的角度看,Expression、Statement、Declaration 有什么区别?

从编译器的角度看,Expression、Statement、Declaration 有什么区别?

Go
慕哥6287543 2021-08-30 15:04:00
我在这里浏览 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? ...

无类型常量具有默认类型,该类型是在需要类型值的上下文中将常量隐式转换为的类型,例如,在没有显式类型的短变量声明中。

一个无类型恒定的默认类型是boolruneintfloat64complex128string分别,这取决于它是否是一个布尔值,符,整数,浮点,复杂,或字符串常量。


查看完整回答
反对 回复 2021-08-30
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

这些是CS中的常用术语。一个表达式产生一个值,而一个语句通常不会产生一个值(最后一点取决于语言,事实上,一些语言将表达式视为语句的一个子类别)。

来自维基百科:

在大多数语言中,语句与表达式的对比在于,语句不返回结果并且仅因其副作用而执行,而表达式总是返回结果并且通常根本没有副作用。

在 Go 中,表达式可以用作语句。

您的困惑似乎来自递增和递减运算符。在 Go 中,与大多数基于 C 的语言相反,增量和减量语句不产生值,它们是语句而不是表达式。也就是说,你可能不会写


查看完整回答
反对 回复 2021-08-30
  • 2 回答
  • 0 关注
  • 369 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信