循环与迭代

  • for

  • while

  • do ... while

循环控制语句:continue/break

for 语句

语法

for (初始化; 测试条件; 迭代语句) {
   // 如果表达式的结果为真,就循环执行以下语句
   ......
}

例子

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

contract For {
    // 输入5    输出15
    function test1(uint256 _x) external pure returns (uint256 temp) {
        for (uint256 i = 1; i <= _x; i++) {
            temp += i;
        }
    }
}

循环控制

  • continue 退出当前迭代

    • 语句可以用来继续执行(跳过代码块的剩余部分并进入下一循环)。

  • break 终止循环

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

contract For {
    // 输入5    输出15
    function test1(uint256 _x) external pure returns (uint256 temp) {
        for (uint256 i = 0; i <= _x; i++) {
            temp += i;
        }
    }

    // 输入5    输出7
    function test2(uint256 _x) external pure returns (uint256 temp) {
        for (uint256 i = 0; i <= _x; i++) {
            if (i == 3) {
                continue;
            }
            if (i == 5) {
                break;
            }
            temp += i;
        }
    }
}

使用 ++i 可以省 gas

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

contract For {
    function test1(uint256 _x) external pure returns (uint256 temp) {
        for (uint256 i = 1; i <= _x; i++) {
            temp += i;
        }
    }
    function test2(uint256 _x) external pure returns (uint256 temp) {
        for (uint256 i = 1; i <= _x; ++i) {
            temp += i;
        }
    }
}
  • 运行 test1

    // 输入 5    : 23658 gas
    // 输入 100  : 58713 gas
    
  • 运行 test2

    // 输入 5    : 23655 gas
    // 输入 100  : 58235 gas
    

while 语句

语法

while (表达式) {
   // 如果表达式的结果为真,就循环执行以下语句
   ......
}

例子

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

contract For {
    function test1(uint256 _x) external pure returns (uint256 temp) {
        uint256 i = 0;
        while (i <= _x) {
            temp += i;
            i++;
        }
    }
}

do…while

语法

do {
   // 如果表达式的结果为真,就循环执行以下语句
   ......
} while (表达式);

例子

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

contract For {
    function test1(uint256 _x) external pure returns (uint256 temp) {
        uint256 i = 0;
        while (i <= _x) {
            temp += i;
            i++;
        }
    }

    function test2(uint256 _x) external pure returns (uint256 temp) {
        uint256 i = 0;
        do {
            temp += i;
            i++;
        } while (i <= _x);
    }
}