- expression
- statement (side effect)
-
b := 2 c := b a := b + c
reference model immutable is important. Reference model every variable is an l-value.
-
Boxing
-
Orthogonality 正交 Algol 68 都是 expression C 同时使用 expression statement, C 提供了特殊的 expression forms for selection and sequencing.
-
combination assignment operators += ++ -- .eg.
-
multiway assignment
initialization assignment in c++ is different, assigenment should decollate first.
Java and C# 不区分
顺序很重要:
- side effects:
a-f(b)-c*d
如果f(b)
影响 d,这个表达式结果就取决于 f(b) 和 c*d 哪个先执行 - code improvement: the order of evaluation of subexpressions has an impact on both register allocation and instruction scheduling. 先后顺序影响代码优化,代码优化不会提供哪个先执行的保证,只保证正确性同时尽可能提升运行速度。
所以,大多数编程语言的 order of evaluation of operands and arguments is undefined.
数学交换律,分配律,相关率。但是在计算机中随便重排操作可能会出现 overflow。或者浮点数在计算机中的表示是近似数,同一个表达式,不同顺序的运算可能会导致不同的结果。
boolean expression 提供了特殊而且重要的代码优化方法 -- 短路。
这种形式的计算,可能会节省运行时间。
但是也有不提供短路能力的语言,比如 Pascal
p := my_list
while (p <> nil) and (p^.key <> val) do
p := p^.next
这种写法就不对,因为两个条件都会执行,就会执行 p = nil 的情况。
但是短路也不总是正面的。比如两个条件 E1 和 E2 都有 side effect, 所以希望同时计算,再判断。有些语言提供了短路和非短路两种选择,比如 Ada 中使用 and / or 表示常规,and then / or else 表示短路。在 C 中,可以使用 & | 可以作为 && || 的非短路选择。