算术运算符
以下算术运算符支持所有的原始数值类型:
表达式 名称 描述 +x
一元加法运算符 全等操作 -x
一元减法运算符 将值变为其相反数 x + y
二元加法运算符 执行加法 x - y
二元减法运算符 执行减法 x * y
乘法运算符 执行乘法 x / y
除法运算符 执行除法 x ÷ y
整除 取 x / y 的整数部分 x \ y
反向除法 等价于 y / x
x ^ y
幂操作符 x
的y
次幂x % y
取余 等价于 rem(x,y)
以及对
Bool
类型的否定:
表达式 名称 描述 !x
否定 将
true
和false
互换
算术运算符的部分和python基本一致,只有几个地方要注意一下。
x ÷ y | 整除 | 取 x / y 的整数部分 |
x \ y | 反向除法 | 等价于 y / x |
x ^ y | 幂操作符 | x 的 y 次幂 |
这三个部分是和python不一致的,但julia中的运算符表示似乎更符合常识,也挺好记的。
位运算符
所有原始整数类型都支持以下位运算符:
表达式 名称 ~x
按位取反 x & y
按位与 x | y
按位或 x ⊻ y
按位异或(逻辑异或) x >>> y
逻辑右移 x >> y
算术右移 x << y
逻辑/算术左移
位运算符和C语言中基本一致,除了按位异或(逻辑异或)符看上去有些诡异。这个符号是"\xor"加Tab键打出来的,这样记好像也不难理解。
复合赋值运算符
每一个二元运算符和位运算符都可以给左操作数复合赋值:方法是把
=
直接放在二元运算符后面。比如,x += 3
等价于x = x + 3
。julia> x = 1 1 julia> x += 3 4 julia> x 4
二元运算和位运算的复合赋值操作符有下面几种:
+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>= <<=
这里就不赘述了,和C 语言完全一样。
有一点需要注意一下,这些是双目运算符,最后会把值赋值到左操作数上,因此可能会改变变量类型
julia> x=2
2
julia> typeof(ans)
Int64
julia> x *= 0.01
2
julia> typeof(ans)
Float64
向量化dot运算符
julia中,每个二元运算符都有一个dot运算符和它对应,表示的含义是逐元素的和后面的操作数进行运算。
julia> [1,2,3] .^ 3
3-element Array{Int64,1}:
1
8
27
需要注意的一点是:
将点运算符用于数值字面量可能会导致歧义。例如,
1.+x
到底是表示1. + x
还是1 .+ x
?这会令人疑惑。因此不允许使用这种语法,遇到这种情况时,必须明确地用空格消除歧义。
数值比较
标准的比较操作对所有原始数值类型有定义:
操作符 名称 ==
相等 !=
,≠
不等 <
小于 <=
,≤
小于等于 >
大于 >=
,≥
大于等于
和现在主流的热门语言的都一样,我就不赘述了。
注意:
整数的比较方式是标准的按位比较,而浮点数的比较方式则遵循 IEEE 754 标准。
- 有限数的大小顺序,和我们所熟知的相同。
+0
等于但不大于-0
.Inf
等于自身,并且大于除了NaN
外的所有数。-Inf
等于自身,并且小于除了NaN
外的所有数。NaN
不等于、不小于且不大于任何数值,包括它自己。
NaN
不等于它自己这一点可能会令人感到惊奇,所以需要注意:julia> NaN == NaN false julia> NaN != NaN true julia> NaN < NaN false julia> NaN > NaN false
由于
NaN
的存在,在做数组比较时会特别头疼:julia> [1 NaN] == [1 NaN] false
为此,Julia 给这些特别的数提供了下面几个额外的测试函数。这些函数在某些情况下很有用处,比如在做 hash 比较时。
函数 测试是否满足如下性质 isequal(x, y)
x
与y
是完全相同的isfinite(x)
x
是有限大的数字isinf(x)
x
是(正/负)无穷大isnan(x)
x
是NaN
isequal
认为NaN
之间是相等的:julia> isequal(NaN, NaN) true julia> isequal([1 NaN], [1 NaN]) true julia> isequal(NaN, NaN32) true
isequal
也能用来区分带符号的零:julia> -0.0 == 0.0 true julia> isequal(-0.0, 0.0) false
有符号整数、无符号整数以及浮点数之间的混合类型比较是很棘手的。开发者费了很大精力来确保 Julia 在这个问题上做的是正确的。
对于其它类型,
isequal
会默认调用==
,所以如果你想给自己的类型定义相等,那么就只需要为==
增加一个方法。如果你想定义一个你自己的相等函数,你可能需要定义一个对应的hash
方法,用于确保isequal(x,y)
隐含着hash(x) == hash(y)
。
另外julia支持链式比较,连等,连大于,连小于,连大于等于,连。。。