表达式和语句
- expression和statement是编程语言常用的概念,但是很多人都搞不清楚,所以我来总结一下
表达式
- 表达式是可以被求值的代码片段
- 表达式可以是一个值,也可以是一个函数调用
- 例如
1+2就是一个表达式,1+2的值是3 - 再比如
console.log(1+2)也是一个表达式,console.log(1+2)的值是undefined
语句
- 语句是一段代码,它可以是一个表达式,也可以是其他的东西
- 也就是说 语句包含着表达式 一一切表达式都可以是语句
- 但是表达式不一定是语句 例如
1+2是一个表达式,但是1+2;不是一个表达式 而是一个语句 因为这段代码没有结果 不可求值 - 在部分语言中 函数可以说表达式 被称为lambda表达式1 因为他可以被赋值给一个变量 例如
let f = function(x) { return x+1; } - 这部分语言往往会把函数作为一等公民 也就是可以作为参数传递 也可以作为返回值返回
- 在上古语言中 一般表达式用来计算结果,语句用来修改程序的状态
- 但是在现代语言中 语句常常也具有返回值 这就极大的模糊了二者的区别,即表达式和语句的合流
表达式和语句的合流
- 这里以rust语言为例,在rust语言中,一切皆表达式
- 例如像 1+2; 这种语句 也是一个表达式 他的值是() 也就是值。即使是
loop{}这样在其他语言中是语句的东西 也是一个表达式 他的值是! - 所以在rust语言中 表达式和语句的区别是非常模糊的。在笔者看来,这主要是因为rust语言的函数血统比较重,为了统一函数和闭包和语句的概念,
- 所以rust语言把所有的代码都当作表达式来处理。
本章中英对照表
| 英文 | 中文 |
|---|---|
| expression | 表达式 |
| statement | 语句 |
| lambda | λ 一个希腊字母 编程中代指匿名函数 |
Footnotes
-
lambda表达式可以写的很深入,比如lambda演算实际上是和图灵机等价的计算机架构,并且还有语言承继了这种思想,比如lisp。但是笔者受限于能力无法过多展开,还望客官见谅。 ↩