原標題:《Solidity 極簡入門: 7.控制流,用solidity 實現插入排序》
我最近在重新學solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每週更新1-3 講。
所有代碼開源在github :github.com/AmazingAng/WTFSolidity
這一講,我們將介紹solidity 中的控制流,然後講如何用solidity 實現插入排序(InsertionSort),一個看起來簡單,但實際上很容易寫出bug 的程序。
控制流
Solidity 的控制流與其他語言類似,主要包含以下幾種:
if-else
for 循環
while 循環
do-while 循環
三元運算符
三元運算符是solidity 中唯一一個接受三個操作數的運算符,規則條件? 條件為真的表達式:條件為假的表達式。此運算符經常用作if 語句的快捷方式。
另外還有continue(立即進入下一個循環)和break(跳出當前循環)關鍵字可以使用。
用solidity 實現插入排序
寫在前面:90% 以上的人用solidity 寫插入算法都會出錯。
插入排序
排序算法解決的問題是將無序的一組數字,例如[2, 5, 3, 1],從小到大一次排列好。插入排序(InsertionSort)是最簡單的一種排序算法,也是很多人學習的第一個算法。它的思路很簡答,從前往後,依次將每一個數和排在他前面的數字比大小,如果比前面的數字小,就互換位置。示意圖:
插入排序python 代碼
我們可以先看一下插入排序的python 代碼:
改寫成solidity 後有BUG!
一共8 行python 代碼就可以完成插入排序,非常簡單。那麼我們將它改寫成solidity 代碼,將函數,變量,循環等等都做了相應的轉換,只需要9 行代碼:
那我們把改好的放到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,坑很多,每個月都有項目因為這些小bug 損失幾千萬甚至上億美元。掌握好基礎,不斷練習,才能寫出更好的solidity 代碼。