Chapter2: Simple Expressions
2.1 注释语句
OCaml语言中注释部分写在(*和*)之间,可以相互嵌套。注释部分当作空格处理。
2.2 基本表达式
OCaml中每个有效的表达式都有一个类型,某个类型的表达式不能用作其他的类型使用。通常不需要显式标明表达式的类型,OCaml会通过类型推导来推导表达式的类型。
OCaml中的基本类型有:unit,int,char,float,bool和string。
2.2.1 unit
OCaml中unit是单例类型(the singleton type),只包含一个元素:(),相当于C语言中的void。由于在函数语言中每隔函数都必须有返回值,因此值()常用于表示副作用计算过程的返回值。
2.2.2 int
OCaml中int类型表示有符号整型。取值的bit数是机器的字长数减一,如:32位机则int的字长是31位。除了常用的十进制表示法外,还有二进制、八进制和十六进制表示方法,如下图2.1所示:
图2.1 int的多进制表示方法
对int类型的常见操作如下图2.2所示:
图2.2 对int型的常见操作
2.2.3 float
OCaml语言中的float类型用于表示浮点类型。浮点类型的数据由小数点或是e(或E)或是两者都有组成。在float类型中小数点前面必须要有数字,小数点后面不一定。
OCaml中浮点数操作符与整型操作符不同,浮点数操作需要在整型操作后面加上符号“.”。OCaml浮点数操作如下图2.3所示。OCaml提供了两个函数进行整型和浮点数之间的转换:int_of_float和float_of_int,如图2.4所示。
图2.3 浮点数操作 图2.4 整型与浮点数之间的转换
2.2.4 char
OCaml语言中使用char类型来表示字符类型,即ASCII码集合中的字符。字符类型使用单引号引出。字符类型中存在有转移字符,其表示如下图2.5所示。其中’\ddd’表示ASCII码表中十进制等于ddd的字符,注意这样的表示中必须要有3个d。同理’\xhh’表示ASCII码表中十六进制等于hh的字符。
图2.5 转义字符
OCaml提供了函数进行ASCII十进制编码和字符之间的转换:Char.code x:返回字符x的ASCII十进制码;Char.chr d:返回ASCII十进制码是x的字符。Char.uppercase x:返回字符x的大写字符,若没有则返回本身;Char.lowercase x:返回字符x的小写字符,若没有则返回x自身。
2.2.5 string
OCaml中使用string类型来表示字符字符串,与C语言中字符串不同的是string并不是字符数组,同时string也不以’\000’作为结尾。OCaml中string使用双引号括出。字符串中的字符使用和字符一样的表示方法表示。
字符串连接符:^。如:”Hello” ^ ” World”;;
OCaml字符串类型也能实现随机存取。s.[i]表示字符串s中第i个字符,i从0开始计数。s.[i] <- c表示将字符串s的第i个字符修改为c,该函数返回一个unit值。
OCaml提供了String模块来提供对字符串进行操作的函数。
2.2.6 bool
OCaml中bool类型含有两种取值:true和false。
逻辑取反运算运算符为:not。
OCaml中常用的逻辑比较运算符如下图2.6所示。其中需要注意的是=运算和==运算的区别。=运算只需要x与y值相等。而==运算则需要x与y是同一个对象,可以认为是指向同一个内存空间。这些比较运算符适用于所有的基本类型。但是对于其他的类型,需要按照实际的实现情况区分。在字符串类型的比较上,使用的是字典序,ASCII码越大的越大。
图2.6 比较运算符
OCaml提供了两个二元逻辑运算:逻辑与运算:&&或写作&;逻辑或运算:||或写作or。与运算和或运算都符合“短路逻辑”,即由第一个操作数决定是否进行第二个操作数的运算。
2.3 运算符优先级和结合性
OCaml语言中基本运算的优先级和结合性如图2.7所示。优先级向下递增。
图2.7 基本运算符优先级和结合性