Solidity极简入门第七讲:控制流,用Solidity实现插入排序

This article is not available in the current language yet. Showing the original version.
这一讲,我们将介绍 solidity 中的控制流,然后讲如何用 solidity 实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出 bug 的程序。

原标题:《Solidity 极简入门: 7.控制流,用 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 代码。

Share to:

Author: 0xAA

Opinions belong to the column author and do not represent PANews.

This content is not investment advice.

Image source: 0xAA. If there is any infringement, please contact the author for removal.

Follow PANews official accounts, navigate bull and bear markets together
PANews APP
It is suspected that the Dragonfly address transferred 137 million SKY tokens to Coinbase, a decrease in value of more than half compared to when the tokens were withdrawn.
PANews Newsflash