Solidity 布尔类型
布尔类型是只有 true 或者 false 两种可能取值的类型。Solidity的布尔类型变量可以用 bool 关键字定义。
运算符
布尔类型可以使用的运算符和作用如下所示,运算操作后得到的结果依然是布尔类型。
!(逻辑非)&&(逻辑与)||(逻辑或 )==(等于)!=(不等于)
布尔类型基本运算
假设 a=false , b=true
!a // true
a && b // false
a || b // true
a == b // false
a != b // true
短路规则
需要注意的是 || 和 && 都服从短路规则(short-circuiting)。其规则如下:
- 对
f(x)||g(y),如果f(x)为true,则g(y)不会再执行 - 对
f(x)&&g(y),如果f(x)为fasle,则g(y)不会再执行
&&和||运算子的短路规则
下面的示例中有两个函数 isEven 判断一个数是否是偶数, isZero 判断一个数是否是0。其中 isZero 函数会有副作用,如果传入的参数为0,那么会使得 zeroCount 加一。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.17;
contract BoolShortCircuit {
uint256 public zeroCount = 0;
function isEven(uint256 num) private pure returns(bool) {
return num%2 == 0;
}
// isZero函数有副作用,会改变状态变量zeroCount的值
function isZero(uint256 num) private returns(bool) {
if(num == 0) {
zeroCount += 1; // 函数副作用,会改变zeroCount的值
}
return num == 0;
}
}
下面的 && 表达式中, isEven(1) 为false,所以,有副作用的函数 isZero(0) 不会执行。因此,不会影响到zeroCount的值。
isEven(1) && isZero(0) //逻辑与
下面的 && 表达式中, isEven(2) 为true,所以会继续执行副作用函数 isZero(0) ,于是 zeroCount 会增加1。
isEven(2) && isZero(0) //逻辑与
下面的 || 表达式中, isEven(2) 为true,所以,有副作用的函数 isZero(0) 不会执行。因此,不会影响到 zeroCount 的值。
isEven(2) || isZero(0) //逻辑或
下面的 || 表达式中, isEven(1) 为false,所以会继续执行副作用函数 isZero(0) ,于是 zeroCount 会增加1。
isEven(1) || isZero(0) //逻辑或
小结
- 布尔类型是用
bool关键字定义的,只有true或false两种取值 - 可以使用的运算符有:逻辑非(
!), 逻辑与(&&), 逻辑或(||), 等于(==), 不等于(!=) - 逻辑或(
||)和逻辑与(&&)都遵循短路规则,即在满足左边条件时不会再执行右边的操作