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。
// 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 {
// 订单已关闭,不作处理
}
}
}
编写实例:
// 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++;
}
}
}