Skip to content

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

运算符优先级

从高到低排列:

  1. ^ 幂运算
  2. 一元运算符 + - ! ~
  3. * / ÷ % & 乘除和按位与
  4. + - | ⊻ 加减和按位或
  5. : .. 范围
  6. < > <= >= == != === 比较
  7. && 逻辑与
  8. || 逻辑或
  9. ? : 条件
  10. = += -= *= /= 赋值
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

下一步

学习完运算符后,请继续学习:

本站内容仅供学习和研究使用。