比较与逻辑运算符 #

一、比较运算符 #

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