2.5 Julia中的算术和逻辑运算
本节介绍Julia中的算术和逻辑运算,这与其他编程语言类似。
2.5.1 执行算术运算
在Julia中执行算术运算十分简单。Julia提供了一整套运算符,比如最常用的二元运算符:+、−、*、/、^和%。
【范例2-21】算术运算
01 julia> a = 10; b = 20; a + b 02 30
代码01行定义了两个变量a和b,它们的值分别为10和20,然后进行a+b运算,结果为30。
如下代码使用一元运算符来反转数字。
01 julia> -4 02 -4 03 julia> -(-4) 04 4
有一个特殊的操作成员“!”,它可以与布尔类型(Bool)一起使用,用于执行否定操作。
01 julia> !(4>2) 02 false
在代码01行中,4>2的结果为true,通过“!”运算符将输出false。
2.5.2 执行按位运算
如表2-3所示为一些不常用的运算符,用于执行按位运算。
表2-3 不常用的运算符
下面举例说明。
【范例2-22】执行按位运算
01 julia> 100 | 200 02 236 03 julia> ~100 04 -101
在代码01行中,对100和200执行按位或运算,结果为236。代码03行将100按位取反,结果为−101。
2.5.3 自更新运算符
Julia也提供了一些自更新运算符,包括:+=、−=、*=、/=。
【范例2-23】自更新运算符
01 julia> x = 4; x += 10 #自增运算 02 14 03 julia> x = 4; x/=2 #自除运算 04 2.0
代码01行定义了一个变量x,其值为4,并通过“+=”自增运算符,x自增10,结果为14。代码03行的操作方法与01行类似。
在范例2-23中,x的类型从Int变为Float,是因为自更新运算符将值提升为左侧的变量类型。
Julia还提供了一些比较运算符,如==、!=、<、<=、>、>=等。
【范例2-24】比较运算符的使用
01 julia> 100 > 99.9 02 true 03 julia> 24 == 24.0 04 true 05 julia> 24 === 24.0 06 false 07 julia> 24 !== 24.0 08 true
在代码01行中,100>99.9,返回true。后面的代码与01行类似。代码05行中的“===”表示强相等,要求不仅值相等,其类型也需要相同。虽然24与24.0值相等,但是它们的类型不同,所以返回false。
NaN不等于任何值,甚至不等于其本身。
01 julia> NaN == NaN 02 false 03 julia> NaN === NaN 04 true 05 julia> Inf == Inf 06 true 07 julia> Inf >= NaN 08 false
在代码01行中,NaN与NaN比较结果为false。代码05行中的Inf表示最大值,值相等及类型相同,所以返回true。代码07行Inf与NaN比较结果为false,因为NaN不与任何值相等,包括它自己。
2.5.4 运算符的优先级
Julia的运算符有优先级,它们从高到低的顺序如表2-4所示。
表2-4 运算符的优先级
2.5.5 类型转换(数字)
类型转换是指更改变量的类型,但保持变量的值不变。
【范例2-25】类型转换
01 julia> Int8(100) #创建一个字长为8位的值 02 100 03 julia> Int8(100*10) 04 ERROR: InexactError() in Int8(::Int64) at ./sysimg.jl:53 05 julia> Int16(100*10) #这个数被解释为16位 06 1000 07 julia> x = Int32(40); typeof(x) #创建一个Int32类型的变量x 08 Int32 09 julia> x = Int8(x); typeof(x) #使用类型转换,转换为8位的Int8 10 Int8
代码01行使用Int8()函数创建了一个字长为8位的值,没有错误。代码03行创建了一个Int8类型的值1000,但是由于1000超出了Int8类型的最大值,所以该行代码将报错。但是如果将其解释为Int16类型的值则不会报错。代码07行创建了一个Int32类型的变量x,求x的类型,结果为Int32。代码10行通过Int8()函数将x转换为Int8类型的变量。