程式的控制流常見的條件控制、迴圈控制在 Solidity 中也有,注意在使用迴圈時,要確保有適當的結束條件,避免潛在的資源浪費和 gas 消耗。另外迴圈也可以使用 continue
(進入下一個迴圈)和 break
(跳出目前的迴圈)。
if-else
function ifElseTest(uint256 _number) public pure returns(string memory){
if (_number > 0) {
return "The number is positive.";
} else if (_number < 0) {
return "The number is negative.";
} else {
return "The number is zero.";
}
}
for
迴圈function sumFor(uint n) public pure returns (uint) {
uint total = 0;
for (uint i = 1; i <= n; i++) {
total += i;
}
return total;
}
while
迴圈function sumWhile(uint n) public pure returns (uint) {
uint total = 0;
uint i = 1;
while (i <= n) {
total += i;
i++;
}
return total;
}
do-while
迴圈function sumDoWhile(uint n) public pure returns (uint) {
uint total = 0;
uint i = 1;
do {
total += i;
i++;
} while (i <= n);
return total;
}
三元運算子 ?:
是 Solidity 中唯一接受三個運算元的運算子。
語法:<condition>?<expression1>:<expression2>
。如果 <condition>
的判斷為 true,結果就是 <expression1>
,如果 <condition>
的判斷為 false,結果就是 <expression2>
。?:
經常作為簡化的 if
條件語句使用。
function ternaryTest(uint256 x, uint256 y) public pure returns(uint256){
return x >= y ? x: y;
}
插入排序是將一組無序的數列由小到大排好,它會從頭開始將每一個數字與前面的數字比較,如果找到比自己大的數字中最小的,插入到它的前一個。
假設數列是 [2, 5, 3, 1]
。
i = 1,第 1 圈時,跟 0 比
i = 2,第 2 圈時,跟 1~0 比
i = 3,第 3 圈時,跟 2~0 比
i = 4,第 4 圈時,跟 3~0 比
arr = [2,5,3,1]
def insertSort(arr):
for i in range(1, len(arr)):
key = arr[i] # 把 i 的元素暫存到 key
j = i - 1
while j >= 0 and arr[j] > key: # 當 j 還沒找完且 key 的前面有更大的數
arr[j+1] = arr[j] # 第 j 個元素往後 1 個
j -= 1
arr[j+1] = key # 把 key 替換到前面
return arr
因為 uint
不可以存到負數,否則運行過程會有 underflow Error,而 j
變數如果按上面的邏輯寫可能會存到負數,所以把 j 加一讓它在計索引過程中最小是 0 就不會引起 Error。
function insertSort(uint[] memory a) public pure returns(uint[] memory) {
for(uint i = 1; i < a.length; i++){
uint temp = a[i];
uint j = i;
while((j >= 1) && (a[j-1] > temp)){ // 當 j 還沒找完且 temp 的前面有更大的數
a[j] = a[j-1]; // 第 j-1 個元素往後 1 個
j--;
}
a[j] = temp; // 把 temp 替換到前面
}
return(a);
}