“ifelse”和Julia中的三元运算符有什么区别?

“ifelse”和Julia中的三元运算符有什么区别?,julia,Julia,假设我有以下代码: cond = true a = cond ? 1 : 2 b = ifelse(cond, 1, 2) 这两个操作之间的区别是什么?在您编写的示例中,没有有效的区别。但是,如果这两个分支比简单的整数文字更复杂,那么有一个区别: julia> f() = (println("calling f()!"); 1) f (generic function with 1 method) julia> g() = (println("cal

假设我有以下代码:

cond = true
a = cond ? 1 : 2
b = ifelse(cond, 1, 2)

这两个操作之间的区别是什么?

在您编写的示例中,没有有效的区别。但是,如果这两个分支比简单的整数文字更复杂,那么有一个区别:

julia> f() = (println("calling f()!"); 1)
f (generic function with 1 method)

julia> g() = (println("calling g()!"); 2)
g (generic function with 1 method)

julia> cond ? f() : g()
calling f()!
1

julia> ifelse(cond, f(), g())
calling f()!
calling g()!
1
换句话说,
ifelse
只是一个普通函数。和所有其他函数一样,它的参数总是被求值的。三元运算符的语法等效于:

if cond
    f()
else
    g()
end

请注意,在某些情况下,这可能会导致处理器使用的指令不同(即,将分支更改为查找),这可能会对性能产生微妙的影响,超出两个分支中代码的成本(如果在
@simd
循环中,则不会如此微妙)。。。但通常Julia和LLVM都非常聪明,只要可能,他们都能做到最好。

请注意,您也可以在一行上编写一个正常的
if
语句。我经常喜欢那种样子<代码>如果条件1或条件2结束。