原文: 《Solidity 極簡入門: 10. 控制流,用solidity 實現插入排序》

我最近在重新學solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每週更新1-3 講。

所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity

這一講,我們將介紹solidity 中的控制流,然後講如何用solidity 實現插入排序(InsertionSort),一個看起來簡單,但實際上很容易寫出bug 的程序。

控制流

Solidity 的控制流與其他語言類似,主要包含以下幾種:

if-else

Solidity極簡入門第十講:控制流,用solidity實現插入排序

for 循環

Solidity極簡入門第十講:控制流,用solidity實現插入排序

while 循環

Solidity極簡入門第十講:控制流,用solidity實現插入排序

do-while 循環

Solidity極簡入門第十講:控制流,用solidity實現插入排序

三元運算符

三元運算符是solidity 中唯一一個接受三個操作數的運算符,規則條件? 條件為真的表達式:條件為假的表達式。此運算符經常用作if 語句的快捷方式。

Solidity極簡入門第十講:控制流,用solidity實現插入排序

另外還有continue(立即進入下一個循環)和break(跳出當前循環)關鍵字可以使用。

用solidity 實現插入排序

寫在前面:

90% 以上的人用solidity 寫插入算法都會出錯。插入排序

排序算法解決的問題是將無序的一組數字,例如[2, 5, 3, 1],從小到大一次排列好。插入排序(InsertionSort)是最簡單的一種排序算法,也是很多人學習的第一個算法。它的思路很簡答,從前往後,依次將每一個數和排在他前面的數字比大小,如果比前面的數字小,就互換位置。示意圖:

Solidity極簡入門第十講:控制流,用solidity實現插入排序

插入排序

python 代碼

我們可以先看一下插入排序的python 代碼:

Solidity極簡入門第十講:控制流,用solidity實現插入排序

改寫成solidity 後有BUG!

一共8 行python 代碼就可以完成插入排序,非常簡單。那麼我們將它改寫成solidity 代碼,將函數,變量,循環等等都做了相應的轉換,只需要9 行代碼:

Solidity極簡入門第十講:控制流,用solidity實現插入排序

那我們把改好的放到remix 上去跑,輸入[2, 5, 3, 1]。 BOOM!有bug!改了半天,沒找到bug 在哪。我又去google 搜」solidity insertion sort」,然後發現網上用solidity 寫的插入算法教程都是錯的,比如:Sorting in Solidity without Comparison

正確的solidity 插入排序

花了幾個小時,在Dapp-Learning 社群一個朋友的幫助下,終於找到了bug 所在。 solidity 中最常用的變量類型是uint,也就是正整數,取到負值的話,會報underflow 錯誤。而在插入算法中,變量j 有可能會取到-1,引起報錯。

這裡,我們需要把j 加1,讓它無法取到負值。正確代碼:

Solidity極簡入門第十講:控制流,用solidity實現插入排序

運行後的結果:

Solidity極簡入門第十講:控制流,用solidity實現插入排序

總結

這一講,我們介紹了solidity 中控制流,並且用solidity 寫了插入排序。看起來很簡單,但實際很難。這就是solidity,坑很多,每個月都有項目因為這些小bug 損失幾千萬甚至上億美元。掌握好基礎,不斷練習,才能寫出更好的solidity 代碼。