Compiler construction 什么';从编译器的角度看,表达式、语句和声明之间的区别是什么?

Compiler construction 什么';从编译器的角度看,表达式、语句和声明之间的区别是什么?,compiler-construction,go,Compiler Construction,Go,我正在浏览ast.Go at的Go源代码,有3种类型的接口,即表达式、语句和声明。但仅凭源代码我无法理解它们之间的区别。我可以理解的是,表达式生成的对象可以被赋值、比较或用作参数,而语句是一些流控制,如if-else或for-loop。 但我找到了一些定义,比如 // An IncDecStmt node represents an increment or decrement statement. IncDecStmt struct { X E

我正在浏览ast.Go at的Go源代码,有3种类型的接口,即表达式、语句和声明。但仅凭源代码我无法理解它们之间的区别。我可以理解的是,表达式生成的对象可以被赋值、比较或用作参数,而语句是一些流控制,如if-else或for-loop。 但我找到了一些定义,比如

    // 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
    }

这不是一个表达式吗?我对如何区分表达式和语句感到困惑,有什么规则吗?

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

在大多数语言中,语句与该语言中的表达式形成对比 语句不返回结果,仅为其目的执行 副作用,而表达式总是返回一个结果,并且经常返回 根本没有副作用

在围棋中

您的困惑似乎来自递增运算符和递减运算符。在Go中,与大多数基于C的语言相反。也就是说,你不能写

b := a++
委员会使用这些术语:

  • :指定通过将运算符和函数应用于操作数来计算值
  • :控制执行
  • (和范围):将非空标识符绑定到常量、类型、变量、函数、标签或包
指定的值为

IncDecStmt = Expression ( "++" | "--" ) .
“++”和“--”语句通过非类型常量1递增或递减其操作数

它使用一个表达式,但仍然是一个语句(不生成新值)

注意:当您声明一个常量而未明确提及其类型时,为:

i := 0 # int8? uint8? int16? ...
非类型化常量有一个默认类型,该类型是常量在需要类型化值的上下文中隐式转换为的类型,例如,在没有显式类型的短变量声明中

非类型化常量的默认类型分别为
bool
rune
int
float64
complex128
string
,具体取决于它是布尔、rune、整数、浮点、复数还是字符串常量


我想你的意思是“陈述而不是表达”?什么是非类型的contstant?@margachris我编辑了答案来回答你的问题。