if-else语句:是最常见的条件语句,用于在指定条件为 true 时执行代码块,否则执行另一个代码块。
//语法
if (条件) {
// 如果条件为真,执行这里的代码
} else {
// 否则执行这里的代码
}
//示例代码
contract IfElseExample {
function checkNumber(uint number) public pure returns (string memory) {
if (number == 0) {
return "零";
} else {
return "不是零";
}
}
}
for循环语句:是一种重复执行代码的语句,通过一个初始表达式,一个条件表达式,以及一个递增表达式来控制循环的迭代次数。在每次迭代中,for循环会先执行初始表达式,然后判断条件表达式的值是否为真。如果为真,就会执行循环体,否则退出循环。每次循环结束后,会执行递增表达式,然后再重复以上步骤。
//语法
for(var i = 0; i < 10; i++) {
// 执行 10 次
}
//示例代码
contract ForExample {
function forExample() public pure {
uint sum = 0;
// 初始表达式:i = 0;循环条件:i < 10;递增表达式:i++
for (uint i = 0; i < 10; i++) {
sum += i;
}
// 最后累加的和为45
assert(sum == 45);
}
}
while循环语句:它在给定条件为真时不断执行循环体。。
//语法
while (条件) {
// 只要 条件 为真,就会不断循环执行代码块
}
//示例代码
contract WhileExample {
uint256 sum;
constructor() public {
uint256 i = 1;
sum = 0;
// 计算1到10的累加和
while (i <= 10) {
sum += i;
i++;
}
}
function getSum() public view returns (uint256) {
return sum;
}
}
注释:在上面的WhileExample合约中,它在构造函数中使用了一个while循环计算1到10的累加和。变量i的初始值为1,每次循环累加和加上当前的i值,然后通过执行i++来增加i的值。当i的值大于10时,循环终止,sum的值就是1到10的累加和。
do-while循环语句:和while循环语句类似,但是它会先执行一次循环内的代码,再判断循环条件是否成立,如果成立,则再次执行。
//语法
do {
// 先执行一次代码块
} while (条件);
//示例代码
contract DoWhileExample {
function doWhileExample() public pure {
uint256 i = 0;
do {
i++;
// 其他语句
} while (i < 10);
}
}
注释:在上面的DoWhileExample 合约中,变量 i 的初始值为 0,我们在循环语句体中对它进行了自增。条件表达式为 i < 10,所以当 i 大于等于 10 时循环结束。因此,循环语句体最多执行 10 次。
注意:在Solidity中没有内存溢出的概念,但是智能合约的执行消耗的 gas 会随着循环的次数增加而增加。如果循环次数太多,可能会超过智能合约的 gas 限制,从而导致智能合约的执行失败。所以使用 while 循环时需要注意死循环问题,需要特别注意编写代码,确保循环可以在一定的时间内结束。在大多数情况下,可以使用for循环或预先知道的循环次数的递推方法来解决问题。