表达式控制语句 2020/5/31
================================================================================
1.1.语法规范:
# 控制语句或函数定义必以 end 结尾
1.2.分类:
复合表达式 : begin 和 (;)
条件求值 : if-elseif-else 和 ?:
短路求值 : &&, ||
重复求值 : while 和 for
异常处理 : try-catch , error 和 throw
任务协程 : yieldto
# 任务提供了非本地的控制流,便于在临时暂停的计算中进行切换。
# 在 Julia 中,异常处理和协同多任务都是使用的这个机制。
================================================================================
2.0.代数系数-数值文本系数
用途:编写多项式表达式更加简洁
规则:
数字变量:被解释为乘法 -2x=(-2)*x; √2x=(√2) * x 优先级略低于一元运算符
指数结合:同单目运算符 2^3x=2^(3x); 2x^3=2*(x^3) 右结合
数值括号: 3(x-1); 2(x-1)^2=2*[(x-1)^2]
括号变量: (x-1)x # 代数因子和变量或括号表达式之间不能有空格
(x-1)(x+1) # ERROR:不要接着写两个变量括号表达式-被解析为函数调用
x(x+1) # ERROR:不要把变量放在括号表达式之前-被解析为函数调用
x = 3
2x^2 - 3x + 1 # 2x^3 =2*(x^3)
2^2x # 2^2x=2^(2x)
3(x-1) # 6
2(x-1)^2 # 8
语法冲突:
以 0x 开头的表达式,都被解析为十六进制文本
以数字文本开头,后面跟着 e 或 E ,都被解析为浮点数文本
以数字文字开头的表达式f始终是32位浮点文字;1.5F22等于1.5 * F22
================================================================================
2.1.复合表达式
定义:用单个表达式按顺序计算多个子表达式,然后返回最后一个子表达式的值作为其值
方法:begin 块和 (;) 链
实例1:begin
z = begin #1.多行书写
x = 1
y = 2
x + y
end # 返回最后表达式的值: 3
(x = 1; #2.多行书写: ";"
y = 2;
x + y)
实例2:(;) 链
z = (x = 1; y = 2; x + y) #3.单行书写: ";"
begin x = 1; y = 2; x + y end #4.单行书写
================================================================================
2.2.条件表达式/语句:
2.2.1.if语句: if Bool-[elseif-else] end
if x < y a=1 #if无局部变量,if块中定义的变量可在之后使用;
elseif x > y a=2 #注意定义的变量引用可能存在问题:若无x>y语句后续出现x>y时提示a未定义
else a=3 #请确保所有可能的代码路径都为变量定义了一个值
end
if 1 println("true") end#错误 值是Bool true or false
2.2.2.链式问号表达式:a ? b : c --结合规则是从右到左; "?",":"和变量之间必须有空格
z=x < y ? "X1" : "X2"
z=x < y ? "X1" : x>y ? "X2" : "X3"
2.2.3.短路求值
说明:
# && , || 布尔运算符称为短路求值,仅计算最少表达式来确定整个链的布尔值。
# a && b 只有 a= true 才计算;a || b 只有 a = false 才计算;都右结合, && 比 || 优先级高
用途: 简洁if 语句替代。
function factorial(n::Int)
n >= 0 || error("msg")# if !(n>=0) error("msg") end
n == 0 && return 1 # if n==0 return 1 end
n * factorial(n-1)
end
================================================================================
2.3.循环
2.3.1.for 循环--可以遍历任意容器
for i in [1,2,3] println(i) end
for i = 1:10 # 1:3 是一个 Range 对象,表示1, 2, 3序列与Matlab一致
println(i)
if i >= 5 break end # -终止循环-#
if i % 3 != 0 continue end # 中断本次循环
end
for i = 1:2, j = 3:4 # 多层 for 循环
println((i, j)) # 用 break 可以直接跳出所有循环
end
# (1,3)
# (1,4)
# (2,3)
# (2,4)
2.3.2.while 循环
# while 循环不同于 Matlab 或者 Python,这是因为 Julia 语言中变量的作用域不同
# 循环体中变量(局部)作用域限制在循环体内,不会影响到循环体外
i = 0;
while i < 5 println("i=",i); global i += 1; end
================================================================================