Tiger语言参考手册(3)

接上

####2.2 返回值
函数调用、赋值、if-thenwhilebreak语句没有返回值,有些情况下,if-thenelse语句也没有返回值。在inend之间为空的let表达式也没有返回值。没有返回值的语句不允许出现在需要有值的语句中,如(a := b) + c,为非法语句。

零个或多个括号组成的由分号分割表达式如(a := 3; b := a),将会按照次序求值,并且返回最后一个表达式的值。如果存在的话,一对空括号是允许的,这将没有返回值。

####2.3 数组和记录

表达式type-id {field-list}(允许有零个或多个field)创建一个新的记录。field的名字、表达式类型以及顺序要求完全匹配给出的记录类型。

表达式type-id [expr1] of expr2创建一个新的数组,该数组的大小由括号内的表达式expr1给出,数组中元素的初始值由of后的表达式expr2诶出。这两个表达式将按照他们出现的顺序被求值。

####2.4 函数调用

函数是一个表达式id (expr-list),可以含有零个或多个以逗号分隔的表达参数。当一个函数被调用时,实参将被从左到右被求值并且按照静态作用域规则被绑定到形参上。

####2.5 操作符

二元操作符有+ - * / = <> < > <= >= & |

括号组以通常的方式表达。

开头的减号将一个整数表达式取负。

二元操作符+ - * /需要整数运算元,并返回一个整数的结果。

二元运算符> < >= <=比较它们的操作数,可以是同是整数或同是字符串,如果比较成立,返回整数1,否则为0。使用ASCII字典顺序进行字符串比较。

二元运算符= <>可以比较任意两个具有相同类型操作数,并返回整数0或1。对整数来说,如果具有相同的值则相等。对字符串来说,如果它们包含相同的字符则相等。对于记录类型来说,如果它们引用相同的记录则相等。对于数组来说,如果它们表示相同的数组则相等。也就是说,记录和数组相比,使用“参考”或“指针”来判断是否相等,而不是内容。

逻辑运算符& |使用惰性求值。即如果左边已经能够确定表达式的值时将不对右边求值。0表示false其他所有值都表示true

一元减号具有最高的优先级,其次是* /,然后是+ -,再次是= <> > < > = <=,之后& |,最后是:=

+ - * /是左关联的,而比较运算符是不关联的,例如a = b = c是非法的,而a = (b = c)是合法的。

####2.6 赋值

赋值表达式lvalue := expr首先计算expr的值,之后再将值与lvalue绑定。赋值表达值没有返回值,所以类似于a := b := 1是非法的。

数组和记录的赋值使用引用而非值。对数组和记录赋值建立一个别名,表示之后所有与之相关的变化都会反映在所有引用的地方。向数组和记录传递实参是类似的。

记录或数组的值从创建到程序终止都存在,即使已经离开了它的定义范围。