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-statement 是 i=1 , test-statement 是 i<=10 , iteration-statement 是 i++ 。
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;
}