本教程使用的开发环境是一款在线编译器——ChainIDE,具体的使用方法在之前的文章当中已经有讲解过,有需要的同学可以自行查看。
序言
智能合约是不可修改的代码,同时也是涉及到资金、决策、事件的程序,需要具备非常高的稳定性。
它就好像我们在日常使用中对商品分级一样,有商业级、工业级、军用品级。作为一个需要非常稳定功能的语言,solidity对逻辑语句的要求是能稳定实现代码的逻辑,同时不出现歧义。
它沿用了C和JS的一些语言特性,但是又有略微的不同,今天就来向大家一个个介绍一下。
条件语句
在程序当中,判断条件是最容易出现的逻辑情况,soliditiy的if条件语句与其他基本相同,但要注意的是,solidity不支持类似于c语言内的switch功能。
if&&else
if (条件表达式) {
被执行语句(如果条件为真)
} else {
被执行语句(如果条件为假)
}
if (条件表达式 1) {
被执行语句(如果条件 1 为真)
} else if (条件表达式 2) {
被执行语句(如果条件 2 为真)
} else if (条件表达式 3) {
被执行语句(如果条件 3 为真)
} else {
被执行语句(如果所有条件为假)
}
作为程序语言当中最基础的条件判断语句,它会非常经常出现在程序当中。当有多个else if条件嵌套时,要注意每个条件之间的关系,尽量避免出现存在交集的条件表达式。
还有一点与其他程序语言不一样的是,在其他语言当中往往会有while(1),if(1)这种写法,但是soilidity当中不支持不同类型默认转换为布尔型的这种写法,所以在编译时会报错。
循环结构
for循环
作为程序里最基本的循环,for循环在solidity当中的应用非常的广泛。由于缺乏一个简便的数组赋值方式,在对变长数组赋值时往往会用到for循环。
uint[] a;
function for_example(uint number) public
{
for(uint i=0; i<number;i++)
{
a.push(i);
}
}
function output_a() view public returns(uint[] memory)
{
return a;
}
在例程当中,演示了一个对不定长数组进行添加值的操作,通过数组自带的push函数进行对a数组值的添加,在output_a当中获得当前a数组的内容。
由于a数组是在函数外定义的,此时的a的储存位置为storage,因此每次调用for_example的时候a数组内的值是会不断累加的。
tips:大家可以看到,在这个示例当中我把对数组的内容修改和对数组内容的查看分成了两个部分,这也是solidity的语言特性之一。
while和do……while
除了for循环以外,我们在程序内调用最多的还有while循环,while循环和do……while循环的最大区别是先进行循环,还是先进行条件语句判断。
while(表达式){
程序语句
}
do{
程序语句
}while(表达式)
在表达式为true时才会进入循环或者重复下一个循环,如果表达式的值为false则跳出循环。
break和continue
前面写了关于循环的内容,这里讲一些关于如何跳出循环的方式。
break表示的是跳出这一层循环,直接从break这里停止,下面的程序就不会运行了。continue表示的是跳出这一次循环,也就是重新从头开始循环。
在有多层循环嵌套的情况下,关键字的作用效果取决于它在哪一层循环的作用域内,这里我使用一个例子做一下讲解。
function multi_circulation() public pure returns(uint,uint)
{
uint d;
uint b=0;
for(uint i=0;i<10;i++)
{
d=0;
while(d<10)
{
d++;
b++;
if(b%5==0)
{
break;
}
}
}
return (d,b); //d为5,b为45
}
在这个函数当中,我们定义了两个变量,分别是d和b。在for循环内有一个i=4时跳过本次循环的语句,因此for循环只执行了9次。
表面上来看,d的值控制着内部的while循环,但实际上每次都是里面的条件语句触发从而跳出循环,每次b的值+5后就会跳出while循环。
如果对流程不清楚的同学可以自己再模拟一下。
tips:除了break和continue以外,还有一种方式可以跳出循环,如果是在函数内,使用return (程序语句)可以直接返回函数的值。
结语
基础教程部分即将就要结束了,在基础教程当中我们学习了关于合约结构、值类型、运算、映射和逻辑语句的部分。
在基础教程的最后,我们将使用一个实际的例子来带大家将这些内容结合到应用场景里,帮助大家更好地理解solidity。