比较与逻辑运算符 #
一、比较运算符 #
1.1 比较运算符列表 #
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| == | 等于 | a == b | 判断是否相等 |
| != | 不等于 | a != b | 判断是否不等 |
| < | 小于 | a < b | 判断是否小于 |
| > | 大于 | a > b | 判断是否大于 |
| <= | 小于等于 | a <= b | 判断是否小于等于 |
| >= | 大于等于 | a >= b | 判断是否大于等于 |
1.2 整数比较 #
solidity
contract IntegerComparison {
function isEqual(uint256 a, uint256 b) public pure returns (bool) {
return a == b;
}
function isNotEqual(uint256 a, uint256 b) public pure returns (bool) {
return a != b;
}
function isLessThan(uint256 a, uint256 b) public pure returns (bool) {
return a < b;
}
function isGreaterThan(uint256 a, uint256 b) public pure returns (bool) {
return a > b;
}
}
1.3 地址比较 #
solidity
contract AddressComparison {
function isSameAddress(address a, address b) public pure returns (bool) {
return a == b;
}
function isZeroAddress(address a) public pure returns (bool) {
return a == address(0);
}
function isNotZeroAddress(address a) public pure returns (bool) {
return a != address(0);
}
}
二、逻辑运算符 #
2.1 逻辑运算符列表 #
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| && | 逻辑与 | a && b | 两者都为真才为真 |
| || | 逻辑或 | a || b | 任一为真即为真 |
| ! | 逻辑非 | !a | 取反 |
2.2 逻辑与 #
solidity
contract LogicalAnd {
function bothTrue(bool a, bool b) public pure returns (bool) {
return a && b;
}
// 短路求值:如果a为false,不会计算b
function shortCircuitAnd(uint256 a, uint256 b) public pure returns (bool) {
return (a > 0) && (b / a > 10);
}
// 多条件检查
function validateUser(
address user,
uint256 balance,
bool isActive
) public pure returns (bool) {
return user != address(0) && balance > 0 && isActive;
}
}
2.3 逻辑或 #
solidity
contract LogicalOr {
function eitherTrue(bool a, bool b) public pure returns (bool) {
return a || b;
}
// 短路求值:如果a为true,不会计算b
function shortCircuitOr(uint256 a, uint256 b) public pure returns (bool) {
return (a == 0) || (b / a > 10);
}
}
2.4 逻辑非 #
solidity
contract LogicalNot {
function negate(bool a) public pure returns (bool) {
return !a;
}
function isNotZero(uint256 value) public pure returns (bool) {
return !(value == 0); // 等价于 value != 0
}
}
三、三元运算符 #
solidity
contract TernaryOperator {
// 条件 ? 真值 : 假值
function max(uint256 a, uint256 b) public pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) public pure returns (uint256) {
return a < b ? a : b;
}
function abs(int256 value) public pure returns (uint256) {
return value >= 0 ? uint256(value) : uint256(-value);
}
}
四、实际应用示例 #
4.1 权限检查 #
solidity
contract AccessControl {
address public owner;
mapping(address => bool) public admins;
bool public paused;
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
modifier onlyAdmin() {
require(admins[msg.sender] || msg.sender == owner, "Not admin");
_;
}
modifier whenNotPaused() {
require(!paused, "Paused");
_;
}
}
4.2 范围检查 #
solidity
contract RangeCheck {
function isInRange(
uint256 value,
uint256 min,
uint256 max
) public pure returns (bool) {
return value >= min && value <= max;
}
function clamp(
uint256 value,
uint256 min,
uint256 max
) public pure returns (uint256) {
require(min <= max, "Invalid range");
return value < min ? min : (value > max ? max : value);
}
}
五、总结 #
比较运算符要点:
| 运算符 | 说明 | 返回值 |
|---|---|---|
| == != | 相等比较 | bool |
| < > <= >= | 大小比较 | bool |
逻辑运算符要点:
| 运算符 | 说明 | 短路行为 |
|---|---|---|
| && | 逻辑与 | 第一个为false则不计算第二个 |
| || | 逻辑或 | 第一个为true则不计算第二个 |
| ! | 逻辑非 | - |
使用建议:
- 使用require进行断言检查
- 利用短路求值优化性能
- 避免复杂的嵌套条件
接下来,让我们学习位运算符!
最后更新:2026-03-27