Skip to content

Latest commit

 

History

History
168 lines (133 loc) · 3.65 KB

11 循环语句.md

File metadata and controls

168 lines (133 loc) · 3.65 KB

循环语句

Solidity 支持 for、while 和 do while 循环。

不要编写无界限制的循环语句,因为这可能会超出 gas 限制,导致您的交易失败。

由于以上原因,while 和 do while 循环很少使用。

以下是代码示例:

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

contract Loop {
    function loop() public {
        // for 循环
        for (uint i = 0; i < 10; i++) {
            if (i == 3) {
                // 使用 continue 跳过当前迭代
                continue;
            }
            if (i == 5) {
                // 使用 break 退出循环
                break;
            }
        }

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

代码解释:

for 循环:使用 for 循环迭代从 0 到 9 的数字,如果 i 等于 3,则使用 continue 跳过当前迭代,如果 i 等于 5,则使用 break 退出循环。
while 循环:使用 while 循环将 j 的值增加到 10。

https://solidity-by-example.org/loop/

扩充

If/Else代码示例

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

contract IfElse {
    function foo(uint x) public pure returns (uint) {
        if (x < 10) {
            return 0;
        } else if (x < 20) {
            return 1;
        } else {
            return 2;
        }
    }

    function ternary(uint _x) public pure returns (uint) {
        // if (_x < 10) {
        //     return 1;
        // }
        // return 2;

        // 编写 if / else 语句的简短快速方法
        // “?” 运算符称为三元运算符
        return _x < 10 ? 1 : 2;
        //当_x < 10的时候返回1 其他情况返回2
    }
}

编写实例

if/else在逻辑业务下的编写实例

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

contract IfElseExample {

  enum State { Open, Closed, Unknown }
    
  struct Order {
    address customer;
    uint amount; 
    State state;
  }

  mapping (uint => Order) public orders;
    address public admin;

    constructor() {
    // 在构造函数中初始化admin为部署者地址
    admin = msg.sender;
  }

  function createOrder(uint orderId, address customer, uint amount) public {
    orders[orderId] = Order({
      customer: customer,
      amount: amount,
      state: State.Open  
      });
    }
  function processOrder(uint orderId) public {
    if (orders[orderId].state == State.Open) {
      // 检查订单金额
      if (orders[orderId].amount < 100) {
        // 低金额订单,立即执行
        orders[orderId].state = State.Closed;  
      } else {
        // 高金额订单,需进一步处理
        orders[orderId].state = State.Unknown;
      }
    } else if (orders[orderId].state == State.Unknown) {
        
      // 未知状态订单,需要管理员审核
      require(msg.sender == admin); 
      orders[orderId].state = State.Closed;
    } else {
      // 订单已关闭,不作处理
    }
  }

}

For/While代码示例

编写实例:

// SPDX-License-Identifier: UNLICENSED 
pragma solidity ^0.8.17;

contract Loops {

  uint[] public numbers;

  constructor() {
    numbers.push(1);
    numbers.push(2);
    numbers.push(3);
  }

  function loopWithFor() public {
    uint len = numbers.length;  //存储数组的长度,通过将length保存到一个本地变量,可以避免多次外部函数调用,只查询一次数组长度,节省gas
    for(uint i = 0; i < len; i++) {
      numbers[i] *= 2;
    }
  }
  
  function loopWithWhile() public {
    uint j = 0;
    uint len = numbers.length; 
    while(j < len) {
      numbers[j] *= 3;
      j++;
    }
  }

}