跳到主要内容

布尔与条件

布尔类型用于表示逻辑上的"真"和"假",是控制程序流程的基础。

布尔值

MiraScript 中的布尔类型只有两个值:true(真)和 false(假)。

let is_student = true;
let has_graduated = false;
debug_print("是学生:", is_student);
debug_print("已毕业:", has_graduated); 

比较运算符

比较运算符将两个值进行比较,返回布尔值:

debug_print("3 > 2:", 3 > 2);     // true
debug_print("3 < 2:", 3 < 2);     // false
debug_print("3 >= 3:", 3 >= 3);   // true
debug_print("3 <= 2:", 3 <= 2);   // false
debug_print("3 == 3:", 3 == 3);   // true
debug_print("3 != 4:", 3 != 4);   // true 

严格相等

== 运算符严格相等,不会进行类型转换。不同类型的值永远不相等:

debug_print(1 == "1");     // false,number 和 string 不同类型
debug_print(0 == false);   // false,number 和 boolean 不同类型 

近似相等

=~ 运算符 用于近似比较,对数字允许微小误差,对字符串忽略大小写:

debug_print(0.1 + 0.2 == 0.3);   // false,浮点精度问题
debug_print(0.1 + 0.2 =~ 0.3);   // true,近似相等
debug_print("Hello" =~ "hello"); // true,忽略大小写 

逻辑运算符

逻辑运算符用于组合布尔表达式:

let a = true;
let b = false;

// 逻辑与:两者都为 true 才是 true
debug_print("true && false:", a && b);   // false

// 逻辑或:至少一个为 true 就是 true
debug_print("true || false:", a || b);   // true

// 逻辑非:取反
debug_print("!true:", !a);               // false
debug_print("!false:", !b);              // true 

也可以使用关键字 andornot 替代符号:

debug_print(true and false);  // false
debug_print(true or false);   // true
debug_print(not true);        // false 

短路求值

逻辑运算符支持短路求值

  • && 左侧为 false 时,右侧不会被计算
  • || 左侧为 true 时,右侧不会被计算
let x = false;
let y = true;
let result = x && y; // y 不会被求值,结果为 false
debug_print(result); 

if 表达式

if 用于根据条件执行不同的代码。在 MiraScript 中,if 是一个表达式,也就是说它有返回值:

let score = 85;

if score >= 60 {
  debug_print("及格了!")
} 

if/else

let temperature = 35;

let advice = if temperature > 30 {
  "天气很热,注意防暑"
} else {
  "天气不错"
};

debug_print(advice); 

if/else if/else

let score = 78;

let grade = if score >= 90 {
  "优秀"
} else if score >= 80 {
  "良好"
} else if score >= 60 {
  "及格"
} else {
  "不及格"
};

debug_print("成绩 $score 分,评级:$grade"); 
条件必须是布尔值

MiraScript 不支持将数字、字符串等隐式转换为布尔值。以下写法会产生运行时错误:

if 0 { }          // 错误!0 不是布尔值
if "" { }         // 错误!空字符串不是布尔值
if nil { }        // 错误!nil 不是布尔值 

正确做法是使用比较或 is 运算符:

let x = 0;
if x == 0 { debug_print("x 是零") }
if x is nil { debug_print("x 是 nil") } 

条件运算符

条件运算符 ? :if/else 的简写,适合简单的二选一:

let age = 20;
let status = age >= 18 ? "成年" : "未成年";
debug_print(status); 

实际应用

// 判断一个年份是否是闰年
let year = 2024;
let is_leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
debug_print("$year 年是闰年吗?", is_leap);

// BMI 计算与评估
let weight = 70;   // 体重(kg)
let height = 1.75; // 身高(m)
let bmi = weight / height^2;

let category = if bmi < 18.5 {
  "偏瘦"
} else if bmi < 24 {
  "正常"
} else if bmi < 28 {
  "偏胖"
} else {
  "肥胖"
};

debug_print("BMI = $(bmi:.1),体型:$category"); 

小结

  • 布尔值只有 truefalse
  • == 严格相等(不转换类型),=~ 近似相等
  • &&/||/!and/or/not 进行逻辑运算
  • if/else表达式,有返回值
  • 条件必须是 boolean 类型,不支持隐式转换