目录
布尔(bool)类型的起源
布尔类型
优化的"布尔"
整数和布尔类型作为条件真假
逻辑运算符
不同形式的逻辑运算符
位运算符表示逻辑运算
优先级
短路计算
连续的逻辑表达式
布尔(bool)类型的起源
布尔是一位英国数学家,他很好地融合了逻辑运算和数学的关系。为了纪念他,用”布尔”表示逻辑的”真”和”假”。布尔类型最早在编程语言Algol 60提出。
布尔类型
布尔类型最早是Algol 60提出。
- 早期面向过程的编程语言用整数表达布尔,一般为0为False, 非0为True,比如C/C++.
- 为了表达接逻辑的真假,一般用宏来指代。c99引入_Bool, 并没有用Bool或者bool的原因是,以往的C代码中用Bool或bool一般是宏定义。C/C++用整数代表真假很简单直接,只要数值为0就是假,不为0就是真,不管是指针还是什么结构。
- 随着编程语言的抽象加强,编程语言将bool当做数据类型,尽可能不允许它和数值直接运算。Java/C#不能用整形数值作为逻辑表达式判断真假,为表达更自然。
- C++虽内置bool类型,和C/Python一样,可以用整形变量作为逻辑判断。
- Ada/Ruby等编程语言不能用整形变量作为逻辑判断。
- Java的布尔关键字是boolean而非bool.
- Ruby比较不一样,0代表真,只有false和nil为假。
- Python 用True和False表示真假,大小为0的容器也是假(比如空列表),字符串””也为假。
- Fortran的logical代表布尔类型,.true.和.false.分别代表真假。
- Kotlin 用Boolean代表布尔类型,值对应true和false.
- Pascal True和False代表真假。
优化的"布尔"
比特Bit是表达布尔类型的最小单位,尽管如此,计算机大部分用字节保存布尔类型,为了方便简单。一些编程语言为了优化存储空间,用比特保存布尔,比如C++的bitset.
整数和布尔类型作为条件真假
- 早期面向过程的编程语言用整数表达布尔,一般为0为False, 非0为True,比如C/C++.
- 早期为了表达逻辑的真假,一般用宏来指代。c99引入_Bool, 却不是更常见的Bool或bool类型,因为早期大部分项目把它们当做是宏定义或者整型的别名,标准受现实裹挟。
- C/Objc/C++用整数代表真假很简单直接,只要数值为0就是假,不为0就是真,不管是指针还是什么结构。
- VB 也支持整数作为条件。
- 随着编程语言的抽象加强,编程语言将bool当做数据类型,尽可能让它只当做条件表达式的唯一类型,不允许它和数值直接运算。
- Java/C#不能用整形数值作为逻辑表达式判断真假,表达更自然。
- C++虽内置bool类型,依然保持对数值的纯真,和C语言/Python语言一样,同样可以用整形变量作为逻辑判断。
- Ada/Ruby/Swift等编程语言不能用整形变量作为逻辑判断。
- JS作为脚本语言,对条件语句的类型没有做限定,任何支持的类型都可以作为判断条件,不管是Number、Object、Function或者Null、Undefined类型等。
- 如果条件不是Boolean类型,JS将调用Boolean()函数转换成布尔类型。
逻辑运算符
逻辑运算符返回布尔值,用于判断真假。
不同形式的逻辑运算符
定义基本的逻辑运算符:&& || !
- C/ObjC/C++/Java/C#/仓颉/PHP/Kotlin 等使用基本逻辑运算符&&和||和!表示与、或、非。
- 事实上,C/C++ iso646.h也提供一套替代符号,用and/or/not代替逻辑运算符,本质是宏定义。
- Shell和C系语言类似,也用!/&&/||代表不同逻辑组合。
- SQL用and、or和not.
- Pascal逻辑与或非和位运算符与或非一样: and or not. 通过运算数类型决定,如果是布尔类型,and/or/not代表逻辑运算,否则代表位运算。
- Fortran 逻辑运算符是.and. .or. .not.三种,判断两个逻辑值相等.eqv.或者不等.neqv.
- PHP 额外支持 and / or / xor 三种逻辑运算符,前两者和 && / || 含义一致,xor表示两个逻辑值必须一真一假才为真。特别注意,and / or / && / || 优先级不同,优先级高低为: && || and or.
- Python 用and和or表达与和或,还提供关键字 in 和 not in指代变量是否在列表中。
- VB 用 And / Or / Not 表示逻辑与或非,另外还支持 Xor 表示异或。注意这里的 Xor 是逻辑运算符,而不是位运算符。
位运算符表示逻辑运算
- C# 支持布尔类型变量用 & | ^ 位运算符实现逻辑运算&& || 和异或操作。因为C# bool类型本身就是0或者1,位运算和逻辑运算结果是统一的。
优先级
- 一般而言,! > && > ||
- VB 的优先级顺序是: Not > And > Or > Xor.
短路计算
&&和||均支持短路计算,短路计算可提高效率也符合人类常识,形如,”你都没来过,还吵吵啥”。
- 大部分编程语言支持短路计算,包括C系语言和Shell.
- C/ObjC/C++/Java/C#/仓颉/PHP/Kotlin/Shell 等。
连续的逻辑表达式
逻辑表达式很容易和数学的数值范围拉上关系,但表达式“i < j < k”在几乎所有编程语言中并不能表达i < j && j < k.
- C/ObjC/C++/Java/C#/VB 等都不支持如上"连续"的逻辑表达式。
- 不能用连续的逻辑表达式的根本原因是语言语法定义了清晰的优先级和结合性,任何操作数和运算符的组合都将产生固定的运算,不管是否是连续的运算符,都得逐一计算才能进入下一个计算,这导致了不能按人类常见的”连续”逻辑表达式去理解。
- 有特例,Python支持连续逻辑表达式,例如print(1 < 10 > 9)返回True, 又被称为链式比较(chained comparison)。
- a < f(x) < b和a < f(x) and f(x) < b有差异,前者f(x)只会计算一次。
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。