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

我在这里浏览 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

    }

不应该是表达式吗?我很困惑如何区分表达式和语句,有什么规则吗?


慕哥6287543
浏览 370回答 2
2回答

哈士奇WWW

该Golang规范使用这些术语:表达式:通过将运算符和函数应用于操作数来指定值的计算。语句:控制执行声明(和范围):将非空标识符绑定到常量、类型、变量、函数、标签或包在IncDecStmt被指定为IncDecStmt = Expression ( "++" | "--" ) ."++" 和 "--" 语句通过无类型常量 1 递增或递减它们的操作数。它使用一个表达式,但仍然是一个语句(不产生新值)。注意:无类型常量是当你声明一个常量而不明确提及它的类型时:i := 0 # int8? uint8? int16? ...无类型常量具有默认类型,该类型是在需要类型值的上下文中将常量隐式转换为的类型,例如,在没有显式类型的短变量声明中。一个无类型恒定的默认类型是bool,rune,int,float64,complex128或string分别,这取决于它是否是一个布尔值,符,整数,浮点,复杂,或字符串常量。

神不在的星期二

这些是CS中的常用术语。一个表达式产生一个值,而一个语句通常不会产生一个值(最后一点取决于语言,事实上,一些语言将表达式视为语句的一个子类别)。来自维基百科:在大多数语言中,语句与表达式的对比在于,语句不返回结果并且仅因其副作用而执行,而表达式总是返回结果并且通常根本没有副作用。在 Go 中,表达式可以用作语句。您的困惑似乎来自递增和递减运算符。在 Go 中,与大多数基于 C 的语言相反,增量和减量语句不产生值,它们是语句而不是表达式。也就是说,你可能不会写
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go