Skip to main content

Solidity for循环

想象一下,如果我们要计算 1+2+3 的和,这很简单:

uint256 sum = 1+2+3;

但是如果我们要计算 1+2+3+…+100000 呢。直接在合约里面写出这个表达式是不可能的。为了避免重复劳动,我们就可以用到循环。Solidity提供了三种循环:

本节我们将会介绍 for 循环。

权衡

当达到同一目的有多个不同可选方案时,往往意味着需要权衡取舍

for循环语法

Solidity的 for 循环的语法与C语言,Javascript基本相同,其语法如下:

for (init-statement; test-statement; iteration-statement) {
// 循环体
}

for循环有三个控制语句:

  • init-statement 用来在循环开始之前初始化循环变量,只执行一次
  • test-statement 用来判断循环是否已经满足退出条件,每一轮循环都会执行一次判断
  • iteration-statement 用来在每一轮循环执行完后(也就是执行完循环体后),改变循环变量的值

例如下面的示例中我们可以看到 init-statementi=1test-statementi<=10iteration-statementi++

for(uint16 i = 1; i <= 10; i++) {
// init-statement是 i=1 ; test-statement是 i<=n ; iteration-statement是 i++
sum += i;
}

上面的例子中, init-statement 定义并初始化了循环变量 i=1 。然后 test-statement 则判断循环变量 i 是否还是小于等于10,如果是就继续执行,如果不是就退出循环。 iteration-statement 则是在每轮循环给循环变量 i 加1。

for循环示例

下面5个示例的逻辑都是一样的:计算从1加到n的总和。这些示例展示了你可以使用的for循环的不同形式来实现一样的功能。

一个典型的 for 循环

下面是一个典型的 for 循环,计算从1加到n的总和。

function sumToN(uint16 n) public pure returns(uint16) {
uint16 sum = 0;
uint16 i;
for(i = 1; i <= n; i++) { // init-statement是 i=1 ; test-statement是 i<=n ; iteration-statement是 i++
sum += i;
}
return sum;
}
试一试 »
init-statement 定义并初始化变量
function sumToN(uint16 n) public pure returns(uint16) {
uint16 sum = 0;
for(uint16 i = 1; i <= n; i++) { //你可以在init-statement里面定义并初始化变量i
sum += i;
}
return sum;
}
试一试 »
init-statement 可以移动到 for 循环之前
function sumToN(uint16 n) public pure returns(uint16) {
uint16 sum = 0;
uint16 i = 1; //init-statement被移动到这里了
for(; i <= n; i++) {
sum += i;
}
return sum;
}
试一试 »
iteration-statement 可以移动到 for 循环内部
function sumToN(uint16 n) public pure returns(uint16) {
uint16 sum = 0;
uint16 i = 1; //init-statement被移动到这里了
for(; i <= n; ) {
sum += i;
i++; // iteration-statement的i++被移到这里了
}
return sum;
}
试一试 »
所有逻辑都可以在 for 循环的循环体里实现
function sumToN(uint16 n) public pure returns(uint16) {
uint16 sum = 0;
uint16 i = 1; //init-statement被移动到这里了
for(;;) {
if(i > n){ // 这个条件语句实现了test-statement的功能
break;
}
sum += i;
i++; // iteration-statement的i++被移到这里了
}
return sum;
}
试一试 »