语句与表达式的基本定义
语句 指构成语言的基本单位,按照一定的语法规则组织,具有完整的意义。
表达式 在数学领域中是一些符号依据上下文的规则,有限而定义良好的组合。
比如数学中的加减乘除就是数学符号。
数学领域的符号是指:可用于标定数字(常量)、变量、操作、函数、括号、标点符号和分组,帮助确定操作顺序以及有其它考量的逻辑语法。
等式 是将两个表达式用等于符号连起来,就构成了等式,例如 6-2=4,即6-2与4是相等的。
比如,在1 + 1 = 2
这个等式中,1 + 1
是表达式,2
也是表达式。但如果数字2
如果单独存在,则不能称之为表达式,它只是一个数学符号;同样+2
和-2
也不是表达式,表达式需具有一个运算或赋值的过程。
——以上探讨基于维基百科
程序中运算符与表达式
程序运算符是构成表达式的基本单位,当“值、变量、常量与运算符依据规则进行组合时,就构成了表达式”。
程序运算符在不同语言中有不同的定义。在这里列举一下java
和javascript
运算符的共同点:
- 算术运算符:
+, -, *, /, %, ++, --
- 关系运算符:
==, !=, >, <, >=, <=
- 位运算符:
&, |, ^, 〜, <<, >>, >>>
- 逻辑运算符:
&&, ||, !
- 赋值运算符:
=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
instanceof
运算符
程序中的表达式与语句
现在来看一个程序代码:
let addUp = 1 + 1;
在这个例子中— —
这些规则构成了一个声明赋值语句,于是我们可以这样解读这个语句:
let addUp = 1 + 1;
声明 变量 赋值运算符 表达式;
这里的let
是程序定义的声明语句,而addUp = 2
是由变量与数字使用=
组成的表达式;语句和表达式组合,就变成了一个语句。
在程序中=
是赋值语句,而等式应该是双等于号==
。
因此let addUp = 1 + 1
不是等式。如果let addUp = 1 + 1
是一个等式,那么1 + 1 = let addUp
也应该成立,但很可惜1 + 1 = let addUp
在程序中是错误的。
let addUp = 1 + 1
若使用双等于描写应该分离语句和表达式:
// 声明语句
let addUp;
// 赋值表达式
addUp = 2;
// 等式表达式
addUp == 1 + 1;
// 等式反过来同样成立
1 + 1 == addUp;
值得一提的是,如果表达式按照程序语言的语法规则组织,作为构成一个程序的基本单位时,它也是一个语句。因此,当表达式是一个程序中的组成部分时,表达式也是语句。
函数表达式
这里需要说一下javascript
中的函数表达式,依据函数式编程的规则,函数可以为变量赋值,那么函数在某些情况下也可以看做表达式,叫做“函数表达式”:
// 声明语句
let addUp
// 等号左边的是声明的变量
// 等号自身是“赋值语句”
// 右边是将函数声明语句当做“函数表达式”
addUp = function () {
return 1 + 1
}
// 将函数表达式看做一个整体,然后组成等式
;(function () {
return 1 + 1
}) == false
// 上面这个也相当于
addUp == false
容易混淆的知识点
赋值语句不能作为表达式看待
注意赋值语句不能作为表达式看待,因为赋值语句仅仅是将自己的值付给别人,造成了语句有值的假象:
const cache = addUp = function () {
return 1 + 1
}
这句话可拆分为:
let addUp
addUp = function () {
return 1 + 1
}
const cache = addUp
运行语句不能作为表达式看待
如果一个方法或函数等子程序的运行结果是一个值,程序会将结果值做为表达式的组成部分:
function addUp(a, b) {
return a + b;
}
addUp(1, 1) == 2;
addUp(1, 1)
这类子程序调用是一个语句,当语句的运行结果是值时,会将这个值作为表达式的组成部分(而非将语句作为组成部分,虽然它看起来像)。
结论
综合这篇文章来看,表达式在程序领域中是变量、常量、数字、字符、运算符以及有返回值的子程序之间依据上下文的规则,有限而定义良好的组合。
一个设想
如果我们使用->
和<-
来代替赋值语句,将=
解放给等式,不再使用==
,那么程序中的一些概念应该更为直观一点:
// 赋值语句:右表达式赋值给左变量
let addUp <- 1 + 1
// 赋值语句:左自然数赋值给右变量
2 -> let two
// 表达式:变量two等于addUp
two = addUp
// 产生true
本文中所有的探索和设想是依照笔者已知的知识构建而成,它不一定对,还请以批判的观点看待这篇文章。