仓颉编程语言布尔类型(Bool)完全指南:字面量、运算符与短路求值实战

发布时间:2026/10/14 8:17:24
仓颉编程语言布尔类型(Bool)完全指南:字面量、运算符与短路求值实战
文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载布尔类型Bool是仓颉编程语言中表示逻辑真与假的基础数据类型也是if、while、do-while等所有条件控制结构的判断依据。本篇基于仓颉开发者文档中的 布尔类型 章节系统讲解Bool的字面量、支持的全部运算符逻辑操作符、关系操作符与复合赋值操作符、短路求值语义与操作符优先级并结合文档中if/while条件表达式、for-in的where条件、Range构造函数与 C 互操作类型映射等实际场景给出可直接运行的代码示例。读完本篇你将能准确使用Bool组合复杂判断条件、编写无副作用的短路求值逻辑并理解仓颉强类型设计下布尔表达式的类型约束。Bool 类型与布尔字面量布尔类型使用Bool表示用来表示逻辑中的真true和假false。作为仓颉语言的基础数据类型之一Bool与整数Int8/Int16/Int32/Int64等、浮点数、Rune、String等类型并列是类型系统中使用频率最高的开关类型。布尔类型只有两个字面量true和false。在仓颉中true与false是语言保留的关键字不能作为标识符使用。下面的例子展示了布尔字面量的基本用法let a: Bool true let b: Bool false与部分弱类型语言不同仓颉是强类型语言布尔值不会与数值隐式互相转换你不能用1或0代替true/false也不能把Bool直接当数值参与算术运算。这一点在if条件中体现得尤为明显见下文Bool 在条件表达式中的应用。从编译器的词法层面看布尔类型对应TokenKind枚举中的BOOLEAN分类对应字符串Bool与INT64、FLOAT64、RUNE等基础类型 Token 并列可参见 TokenKind 类型public enum TokenKind : ToString { ... | BOOLEAN // Bool ... }Bool 支持的操作符总览布尔类型支持的操作符包括三类类别操作符说明逻辑操作符!逻辑非一元前缀操作符逻辑操作符逻辑与二元中缀操作符逻辑操作符\|\|逻辑或二元中缀操作符关系操作符、!判等与判不等部分关系操作符结果类型为Bool复合赋值操作符、\|\|逻辑与赋值、逻辑或赋值其中部分关系操作符的说法意味着Bool自身不参与、、、这类大小比较布尔值之间没有大小次序但支持与!判等操作。所有关系操作符包括作用于其他类型的六种操作符的表达式结果类型都是Bool即值只可能是true或false详见 基本操作符 中关系操作符一节的说明。逻辑操作符!、、||仓颉编程语言支持三种逻辑操作符逻辑非!、逻辑与、逻辑或||相关完整说明可参考 基本操作符 中的逻辑操作符小节。逻辑非!逻辑非!是一元前缀操作符作用是对其操作数的布尔值取反!false的值等于true!true的值等于false。var a: Bool true // a true var b: Bool !a // b false var c: Bool !false // c true注意一元!同时承担按位求反职责作用于整数类型时为按位取反如!10结果为-11。当操作数为Bool时!表示逻辑非。逻辑与与逻辑或||逻辑与和逻辑或||都是二元中缀操作符两个操作数必须同为布尔类型对于表达式expr1 expr2只有当expr1和expr2的值均等于true时整个表达式的值才等于true对于表达式expr1 || expr2只有当expr1和expr2的值均等于false时整个表达式的值才等于false。真值表如下expr1expr2expr1 expr2expr1 || expr2truetruetruetruetruefalsefalsetruefalsetruefalsetruefalsefalsefalsefalse对应的可编译示例var a: Bool true true // a true var b: Bool true false // b false var c: Bool false false // c false var d: Bool false true // d false a true || true // a true b true || false // b true c false || false // c false d false || true // d true短路求值语义逻辑与和逻辑或||采用短路求值short-circuit evaluation策略计算expr1 expr2时当expr1 false则无需对expr2求值整个表达式的值为false计算expr1 || expr2时当expr1 true则无需对expr2求值整个表达式的值为true。短路求值不仅是性能优化更直接影响程序行为右侧表达式未被求值时其可能产生的副作用函数调用、输出、变量修改等也不会发生。下面的示例用带输出的函数验证这一点func isEven(a: Int64): Bool { if ((a % 2) 0) { println(${a} is an even number) true } else { println(${a} is not an even number) false } } main() { var a: Bool isEven(2) isEven(20) var b: Bool isEven(3) isEven(30) // isEven(3)返回值是falseb值为false无需对isEven(30)求值 a isEven(4) || isEven(40) // isEven(4)返回值是truea值为true无需对isEven(40)求值 b isEven(5) || isEven(50) }该示例中isEven(3) isEven(30)只打印一行 3 is not an even numberisEven(4) || isEven(40)只打印一行 4 is an even number。短路求值让先做前置检查、再执行后续操作的判断模式既安全又高效例如if (index 0 arr[index] 0)这样的写法可以避免越界访问。结合短路求值的实际应用仓颉的if表达式条件中多个布尔表达式通过/||直接连接即构成复合条件例如数值同时满足两个区间判断let i 5 if (i 0 i 10) { println(i 在区间 (0, 10) 内) }而在for-in表达式中可以用where关键字引导一个布尔表达式作为循环过滤条件每次进入循环体前先计算该表达式值为true才执行循环体。例如只遍历奇数main() { for (i in 0..8 where i % 2 1) { // i 为奇数才会执行循环体 println(i) } }运行以上程序将输出1 3 5 7关系操作符 与 !关系操作符包括六种相等、不等!、小于、小于等于、大于、大于等于。它们都是二元操作符要求两个操作数的类型相同而关系表达式的类型一律是Bool类型。对于Bool类型本身适用的关系操作符是与!。判等与判不等可用于布尔值的比较其真值表为true true为truetrue false为falsefalse ! true为true。典型用法main(): Int64 { var flag: Bool true var isTrue: Bool flag true // true var isFalse: Bool flag ! false // true return 0 }关系表达式同样可以与其他布尔表达式组合。例如元组类型支持判等与!判不等当且仅当其所有元素均支持和!运算两个同类型元组实例相等当且仅当它们长度相同且对应索引位置的所有元素均相等其结果就是Boolvar isTrue: Bool (1, 3) (0, 2) // false此外is类型检查操作符expr is Type与as类型转换等表达式也以布尔结果参与条件判断完整的操作符优先级与结合性表参见 操作符附录。复合赋值操作符 与 ||仓颉编程语言提供和||两个逻辑复合赋值操作符。它们与、-等复合赋值操作符一样本质上是赋值表达式的一种expr1 expr2等价于把expr1 expr2的布尔结果重新赋给左操作数对应的变量expr1 || expr2等价于把expr1 || expr2的布尔结果重新赋给左操作数对应的变量。复合赋值表达式的求值顺序遵循统一规则总是先计算左边的表达式的左值然后根据这个左值取右值再将此右值与右边的表达式做计算最后赋值。因为复合赋值表达式也是赋值表达式所以复合赋值操作符是非结合的且复合赋值表达式要求两个操作数的类型相同详见 基本操作符 中复合赋值操作符小节。特别地文档明确指出复合赋值若涉及短路规则会继续遵循短路规则。也就是说与||同样具备短路求值特性。示例main() { var a: Bool true var b: Bool false a (b false) // 等价于 a a (b false)结果为 true println(a) // true b || (a false) // 等价于 b b || (a false)a false 为 false结果仍为 false println(b) // false var flag: Bool true flag false // flag false flag || true // flag true }在实际编码中flag cond常用来实现逐条件收紧的开关只有所有条件都成立时flag才保持为true而flag || cond常用来实现任一条件成立即置位。由于短路求值的存在a expr在a为false时不会对expr求值a || expr在a为true时不会对expr求值这在需要避免不必要的函数调用或空指针判断的场景中非常实用。操作符优先级与结合性正确书写布尔表达式离不开对优先级的把握。根据 操作符附录 中的完整优先级表数值越小优先级越高与Bool相关的操作符优先级如下操作符优先级结合方向!逻辑非3右结合、!10无不可链式结合14左结合\|\|15左结合、\|\|及其余复合赋值18无赋值18无由此可以推导几个关键结论!的优先级高于所有二元逻辑与关系操作符因此!a b解析为(!a) b/!的优先级高于高于||因此a b c ! d解析为(a b) (c ! d)无需额外加括号的优先级高于||因此a || b c解析为a || (b c)赋值与复合赋值操作符优先级最低且不结合因此a b c解析为a (b c)。仓颉还支持自定义类型的操作符重载包括逻辑与关系操作符相关机制参见 操作符重载。Bool 在条件表达式中的应用强类型约束仓颉是强类型语言if、while、do-while等控制表达式的条件必须是布尔类型的表达式这与 C 语言以非 0 值作为真值的约定完全不同。仓颉不会把整数或浮点数隐式当作布尔值使用if (number)这类写法会直接编译报错参见 表达式main() { let number 1 if (number) { // 编译错误类型不匹配 println(非零数) } }这种设计从根本上杜绝了判等误写成赋值这类常见错误赋值表达式包含赋值操作符的表达式的类型是Unit、值是()而不是Bool因此if (a 5)同样会编译报错无法通过编译。相关讨论可参见 基本操作符 开头的说明以及 Unit 类型Unit只有一个值()除赋值、判等和判不等外不支持其他操作。典型的条件判断写法如下完整示例见 表达式main() { let number: Int8 10 if (number % 2 0) { println(偶数) } else { println(奇数) } }while与do-while的条件同样必须是Boolvar i 0 while (i 10) { i }提示if/while的条件除了布尔表达式还允许 let patternlet pattern - expression语法糖以及多个 let pattern 与布尔表达式通过/||组合的形式例如if (let Some(b) - a)。这类模式匹配成功的值为true匹配失败为false本质上仍是布尔判定详见 表达式 与 Option 类型。Bool 在库与互操作场景中的体现Bool不仅是语法层面的基础类型也广泛出现在仓颉标准库类型与 C 互操作接口中区间类型的构造参数RangeT的构造函数签名为RangeT(start: T, end: T, step: Int64, hasStart: Bool, hasEnd: Bool, isClosed: Bool)其中hasStart、hasEnd、isClosed三个Bool参数分别控制区间是否含起始值、终止值以及是否闭区间参见 区间类型// RangeT(start: T, end: T, step: Int64, hasStart: Bool, hasEnd: Bool, isClosed: Bool) let r1 RangeInt64(0, 10, 1, true, true, true) // r1 contains 0, 1, ..., 9, 10 let r2 RangeInt64(0, 10, 1, true, true, false) // r2 contains 0, 1, ..., 9C 互操作类型映射在仓颉与 C 语言互操作FFI中Bool与 C 的bool类型对应占用 1 字节见 Cangjie-C 互操作 中的基础类型映射表Cangjie TypeC TypeSize (byte)Boolbool1标准库 API 返回值仓颉字符串等类型的接口大量以Bool作为返回值例如isEmpty()判断字符串长度是否为 0、isNull()判断指针是否为null、startsWith(str)判断字符串是否以str开头、equals(rhs)判断相等忽略大小写版本为equalsLower等见 Cangjie-C 互操作 中 CString 相关接口列表let t2: Bool s2.isEmpty() let t3: Bool s1.equals(s2) let t4: Bool s1.startsWith(s2)小结Bool是仓颉编程语言中最基础也最常用的类型之一其要点可以概括为字面量仅有true和false两个保留关键字值无其他构造方式逻辑操作符!非、与、||或其中与||遵循短路求值右侧表达式在可提前确定结果时不求值关系操作符Bool支持与!所有关系表达式的类型均为Bool复合赋值与||是赋值表达式左值先求、保留短路语义、非结合优先级!/!|| 赋值类操作符可通过括号显式控制强类型约束if/while/do-while条件必须为Bool数值不能隐式充当布尔值这也从语言层面规避了误写成的经典错误。想进一步了解其他基础类型整数、浮点数、字符、字符串、元组、区间、Unit、Nothing与操作符全貌可继续阅读 基本数据类型目录 下的对应章节以及 基本操作符 与 操作符附录。赞分享文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载相关推荐仓颉编程语言布尔类型Bool完全指南字面量、逻辑运算与短路求值实战仓颉编程语言布尔类型Bool完全指南字面量、逻辑运算与短路求值实战 仓颉编程语言使用 Bool 类型表示逻辑中的真 true 与假 false 文档编程语言Gopeed 完整指南多协议下载器一个任务列表装下 5 种协议AI 也能直接管Gopeed 完整指南多协议下载器一个任务列表装下 5 种协议AI 也能直接管 Gopeed 是一个用 Go 和 Flutter 写的免费开源多协议下载器网络CLI后端Move 语言布尔类型 bool 完全指南字面量、逻辑运算与控制流Move 语言布尔类型 bool 完全指南字面量、逻辑运算与控制流 本篇技术指南系统讲解 Diem 项目中 Move 语言的内建布尔类型 bool 从 tr区块链金融科技上一篇Open Design 复刻 IBM Carbon 设计系统从视觉规范到 Token 落地的完整实践指南下一篇Tinycast 工程规范完全指南Posture、不可妥协项与完成标准解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考