Julia语言程序设计
上QQ阅读APP看书,第一时间看更新

5.2 判断逻辑

在实际的业务逻辑中,常需根据不同的情况作出判断,并选择对应的分支以执行不同的处理过程,让程序适应场景的变化。这是判断逻辑(Conditional Evaluation)的经典功能。

在Julia中,关键字if、elseif、else和end组成了判断逻辑的主要结构,基本语法为:


if 条件表达式1
  # 实现体
elseif 条件表达式2
  # 实现体
elseif 条件表达式3
  # 实现体
else
  # 实现体
end

其中,“条件表达式”不需要像C++语言那样使用括号界定,只需用空格与if、elseif这两个关键字隔开即可。不过,条件表达式一定要是能够返回布尔型结果的逻辑运算。

提示 结构中的if是必需的,且只能出现一次;else可以不出现但若出现则只能一次;而elseif可多次使用,但需在if之后、else之前。

实际上,每个关键字(除end之外)之后的语句块均可视为复合表达式,都可以有自己的返回值,例如:


julia> if 3 > 0 || 2 > 0 && !(0 > 3)
         2
       else
         -2
       end
2

julia> if x > 0
         "positive!"
       else
         "negative..."
       end
"positive!"

julia> z = if 3 < 0
             10
           else
             -10
           end
-10

Julia中的数值本身同样可以构成独立的语句,也同样是表达式,所以也是其所处复合表达式的子表达式。当一个数值或变量处于复合表达式的最后时(如上例所示),其便是该复合表达式的返回值。

在判断逻辑的运行过程中,程序会按需对if与elseif的逻辑条件进行判断,如果表达式为true,则会进入对应的语句块执行,执行完成后便会直接返回其中复合表达式的结果,不再执行结构中的其他语句,即if或elseif构成的多个语句块中只有一个会被执行。例如:


julia> if 3 > 0       # 条件为true,
         3            # 运行返回
       elseif 2 > 0   # 条件为true,
         2            # 但不会运行
       end
3

julia> if 0 > 3       # 条件为false,
         0            # 不会运行
       elseif 3 > 0   # 条件为true,
         3            # 运行返回
       elseif 2 > 0   # 条件为true,
         2            # 但不会运行
       else
         nothing
       end
3

需要注意的是,在为if或elseif提供条件表达式时,是不支持将1或0这种整型值直接作为true或false使用的,若那样做会直接报错,例如:


julia> if 1
         println("true")
       end
ERROR: TypeError: non-boolean (Int64) used in boolean context

julia> if !0
         println("this is error")
       end
ERROR: MethodError: no method matching !(::Int64)

在Julia中,1或0与true或false是完全不同的类型,不能混用,下文介绍的循环结构中同样如此。

对于语句简单或表达式并不复杂的情况,可使用三元运算符?:实现判断逻辑。例如,在表达式a?b:c(注意各符号之间有空格)中a是条件表达式,值为true时该三元运算符返回b值,否则返回c值。例如:


julia> x=3; x>10 ? true : false   # x为3,所以>10不成立,返回第二个值false
false

julia> 3>0 ? 3 : 0
3

julia> false ? 3 : 0
0

需要注意的是,在v1.0版的Julia中,符号?及:的前后都需要有空格,否则会报错。

此外,这种简单的逻辑判断,还可以考虑使用内置的ifelse()函数,其原型为:


ifelse(condition::Bool, x, y)

当condition为true时返回x,否则返回y值。例如:


julia> ifelse(1>0,1,0)
1

julia> ifelse(1<0,1,0)
0

函数ifelse()可实现if结构或?:类似的功能,但本质却是不同的。很多时候使用ifelse()函数代替if结构能够消除过多的逻辑分支,生成更为高效的代码。