跳转至

语句

运算符

  • 布尔运算符
&&  // 与
||  // 或
!  // 非
  • 比较运算符(返回布尔值)
==
!=
>
>=
<
<=
  • 算数运算符
+
-
*
/
%  // 取余
**  // 乘方(幂)

判断语句

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract IfElse {
    function demo(uint _x) external pure returns (uint) {
        if (_x < 10) {
            return 1;
        } else if (_x < 20) {
            return 2;
        } else {
            return 3;  // 最后这个else可以省略掉
        }
    }

    // 三元表示法
    function demo2(uint _x) external pure returns (uint) {
        return _x < 10 ? 1 : 2;
    }
}

循环语句

智能合约中要尽可能控制循环的次数以节省Gas

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract ForAndWhileLoops {
    function loops() external pure {
        // for循环
        for (uint i = 0; i < 10; i++) {
            if (i == 3) {
                continue;  // 跳过本次循环
            }
            if (i == 5) {
                break;  // 结束循环
            }
        }

        // while循环
        uint j = 0;
        while (j < 10) {
            j++;
        }
    }
}

报错控制

如果不符合条件,则状态回滚,Gas返还,报错

错误描述越长消耗Gas越高,可以用自定义错误节省Gas

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Error {
    // require
    function demo1(uint _i) public pure {
        require(_i <= 10, "error tips");  // 错误信息越长消耗Gas越高
    }

    // revert
    function demo2(uint _i) public pure {
        if (_i > 10) {
            revert("error tips");  // 错误信息越长消耗Gas越高
        }
    }

    // error 自定义错误,需要搭配revert使用
    error MyError(address caller, uint i);  // 可以不带参数
    function demo3(uint _i) public view {
        if (_i > 10) {
            revert MyError(msg.sender, _i);  // 节省Gas
        }
    }

    // assert 断言
    uint public num = 123;
    function demo4() public view {
        assert(num == 123);
    }
}