Julia 基本运算符
Julia 提供了丰富的运算符,包括算术运算符、比较运算符、逻辑运算符和位运算符等。
算术运算符
基本算术运算
julia
a = 10
b = 3
# 加法
println(a + b) # 13
# 减法
println(a - b) # 7
# 乘法
println(a * b) # 30
# 除法
println(a / b) # 3.333...(返回浮点数)
# 整除(向下取整)
println(a ÷ b) # 3(等同于 div(a, b))
# 取余(模运算)
println(a % b) # 1(等同于 rem(a, b))
# 幂运算
println(a ^ 2) # 100
# 负号
println(-a) # -10除法变体
julia
a = 10
b = 3
# 标准除法(总是返回浮点数)
println(10 / 3) # 3.333...
# 整除(向下取整,÷ 或 div)
println(10 ÷ 3) # 3
println(div(10, 3)) # 3
# 取余
println(10 % 3) # 1
println(rem(10, 3)) # 1
# 取模(处理负数时不同于 rem)
println(mod(10, 3)) # 1
println(rem(-10, 3)) # -1
println(mod(-10, 3)) # 2
# 同时获取商和余数
q, r = divrem(10, 3)
println("商: $q, 余: $r") # 商: 3, 余: 1
# 浮点除法取整
println(fld(10, 3)) # 3(向负无穷取整)
println(cld(10, 3)) # 4(向正无穷取整)复合赋值运算符
julia
x = 10
x += 5 # x = x + 5
println(x) # 15
x -= 3 # x = x - 3
println(x) # 12
x *= 2 # x = x * 2
println(x) # 24
x /= 4 # x = x / 4
println(x) # 6.0
x ^= 2 # x = x ^ 2
println(x) # 36.0
# 整除赋值
x = 10
x ÷= 3
println(x) # 3
# 取余赋值
x = 10
x %= 3
println(x) # 1比较运算符
基本比较
julia
a = 5
b = 3
# 等于
println(a == b) # false
# 不等于
println(a != b) # true
println(a ≠ b) # true(Unicode 写法)
# 大于
println(a > b) # true
# 小于
println(a < b) # false
# 大于等于
println(a >= b) # true
println(a ≥ b) # true(Unicode 写法)
# 小于等于
println(a <= b) # false
println(a ≤ b) # false(Unicode 写法)链式比较
Julia 支持数学风格的链式比较:
julia
x = 5
# 链式比较
println(1 < x < 10) # true
println(1 ≤ x ≤ 10) # true
println(1 < 5 < 3) # false
# 等价于
println(1 < x && x < 10) # true
# 多重链式
println(1 < 2 < 3 < 4) # true近似比较
julia
# 浮点数比较(考虑精度问题)
a = 0.1 + 0.2
b = 0.3
println(a == b) # false(浮点精度问题)
println(isapprox(a, b)) # true
println(a ≈ b) # true(≈ 是 isapprox 的中缀形式)
# 指定容差
println(isapprox(1.0, 1.001, atol=0.01)) # true(绝对容差)
println(isapprox(1.0, 1.001, rtol=0.01)) # true(相对容差)对象比较
julia
# === 检查对象同一性
a = [1, 2, 3]
b = [1, 2, 3]
c = a
println(a == b) # true(值相等)
println(a === b) # false(不是同一对象)
println(a === c) # true(是同一对象)
# 对于不可变类型
x = 5
y = 5
println(x === y) # true(不可变类型值相等即同一)逻辑运算符
基本逻辑运算
julia
a = true
b = false
# 逻辑与
println(a && b) # false
println(a & b) # false(按位与,对布尔值效果相同)
# 逻辑或
println(a || b) # true
println(a | b) # true(按位或)
# 逻辑非
println(!a) # false
println(!b) # true短路求值
julia
# && 短路与:第一个为 false 时不执行第二个
x = 5
x > 0 && println("x 是正数") # 会打印
x < 0 && println("x 是负数") # 不会打印
# || 短路或:第一个为 true 时不执行第二个
x > 0 || println("x 不是正数") # 不会打印
x < 0 || println("x 不是负数") # 会打印
# 常用模式
function validate(x)
x === nothing && return false
x < 0 && return false
return true
end三元运算符
julia
x = 10
# condition ? value_if_true : value_if_false
result = x > 5 ? "大于5" : "小于等于5"
println(result) # 大于5
# 可以嵌套
grade = 85
level = grade >= 90 ? "A" : grade >= 80 ? "B" : grade >= 70 ? "C" : "D"
println(level) # B位运算符
按位运算
julia
a = 0b1010 # 10 的二进制
b = 0b1100 # 12 的二进制
# 按位与
println(a & b) # 8(0b1000)
# 按位或
println(a | b) # 14(0b1110)
# 按位异或
println(a ⊻ b) # 6(0b0110)
println(xor(a, b)) # 同上
# 按位非
println(~a) # -11(取反)
# 查看二进制表示
println(bitstring(UInt8(10))) # "00001010"
println(bitstring(UInt8(12))) # "00001100"移位运算
julia
a = 8 # 0b1000
# 左移
println(a << 1) # 16(0b10000)
println(a << 2) # 32(0b100000)
# 右移(算术右移,保留符号)
println(a >> 1) # 4(0b100)
println(a >> 2) # 2(0b10)
# 无符号右移
println(a >>> 1) # 4特殊运算符
范围运算符
julia
# 使用 : 创建范围
r = 1:10
println(collect(r)) # [1, 2, 3, ..., 10]
# 带步长的范围
r = 1:2:10
println(collect(r)) # [1, 3, 5, 7, 9]
# 使用 range 函数
r = range(0, 1, length=5)
println(collect(r)) # [0.0, 0.25, 0.5, 0.75, 1.0]字符串运算符
julia
# 字符串拼接
s1 = "Hello"
s2 = "World"
println(s1 * " " * s2) # "Hello World"
# 字符串重复
println("ab" ^ 3) # "ababab"
# 字符串插值
name = "Julia"
println("Hello, $name!") # "Hello, Julia!"点运算符(向量化)
julia
# 点运算符对数组进行元素级操作
a = [1, 2, 3, 4, 5]
# 元素级运算
println(a .+ 10) # [11, 12, 13, 14, 15]
println(a .* 2) # [2, 4, 6, 8, 10]
println(a .^ 2) # [1, 4, 9, 16, 25]
# 元素级比较
println(a .> 3) # [false, false, false, true, true]
# 函数向量化
println(sqrt.(a)) # [1.0, 1.414..., ...]
println(sin.(a))
# @. 宏自动向量化
result = @. sin(a) + cos(a)成员运算符
julia
# in 运算符
arr = [1, 2, 3, 4, 5]
println(3 in arr) # true
println(3 ∈ arr) # true(Unicode)
println(6 in arr) # false
println(6 ∉ arr) # true(不属于)
# 对字符串
println('a' in "hello") # false
println('e' in "hello") # true
# 对字典
d = Dict("a" => 1, "b" => 2)
println("a" in keys(d)) # true管道运算符
julia
# |> 管道运算符
result = [1, 2, 3, 4, 5] |> sum |> sqrt
println(result) # 3.872...
# 等价于
result = sqrt(sum([1, 2, 3, 4, 5]))
# 链式操作
[1, 2, 3, 4, 5] |>
x -> filter(n -> n > 2, x) |>
sum |>
println # 12运算符优先级
从高到低排列:
^幂运算- 一元运算符
+ - ! ~ * / ÷ % &乘除和按位与+ - | ⊻加减和按位或: ..范围< > <= >= == != ===比较&&逻辑与||逻辑或? :条件= += -= *= /=赋值
julia
# 优先级示例
println(2 + 3 * 4) # 14(乘法优先)
println((2 + 3) * 4) # 20
println(2 ^ 3 ^ 2) # 512(幂运算右结合)
println((2 ^ 3) ^ 2) # 64
println(true || false && false) # true(&& 优先于 ||)自定义运算符
Julia 允许定义自定义运算符:
julia
# 定义中缀运算符
⊕(a, b) = a + b + 1
println(3 ⊕ 4) # 8
# 使用 Unicode 符号
∥(a, b) = a * b / (a + b) # 并联电阻
println(100 ∥ 100) # 50.0下一步
学习完运算符后,请继续学习: