本文共 1501 字,大约阅读时间需要 5 分钟。
一起学智能合约之四表达式和控制结构
一、控制结构
在Solidity中,主要有以下控制结构:
1、条件语句:if,if…else
if(msg.sender != admin){
…….;
}else{
……
}
Solidity中不支持从非布尔类型类型到布尔类型的转换, 所以类似if (1){…}这种语句会引起编译错误。
2、循环while语句
while (i++ < 20) {
same1 = i+100;
if (i > 3){
break;
}
}
continue的用法和break的方法类似。return的方法使用是直接退出当前函数,这个就不再多说了。
3、循环for语句
for (uint i = 0; i < 100; i++){
num = i + 1;
}
综合以上,基本上来说,这些语句的语义和常见的编程语言的语义基本相同。但是这里没有switch和goto。
二、表达式
表达式是由一个或者多个运算对象构成,运算对象之间可以通过运算符连接起来。对表达式求值最后都会得到一个结果。
Solidity中的表达式同控制结构类似,和其它语言的没有本质的区别,由于Solidity是图灵完备的,所以类似递归等调用,都是支持的(前提是你得有足够的gas)。
表达式的计算顺序是不确定的(准确地说是, 顺序表达式树中的子节点表达式计算顺序是不确定的的, 但他们对节点本身,计算表达式顺序当然是确定的)。只保证语句执行顺序,以及布尔表达式的短路规则。表达式计算的次序和运算符的优先级有很大关联。
看一个递归的例子:
contract example {
function rec(uint a) returns (uint r) {
return rec(10);
}
}
需要说明的是,Solidity中也是支持无名函数的。在后面会专门介绍。
三、输入和输出参数
类似于c语言,输入参数如果未使用,则可以没有名字(c语言在声明函数时,参数可以只有类型没有参数名)。
pragma solidity ^0.4.0;
contract Simple {
//函数的入参如变量的定义方式
//未使用的参数可以省略变量名
function InputPara(uint a, uint) {
a = a + 1;
}
}
而输出参数则类似于go,如果没有显示指定返回,则推定返回。当然,它们的名字如果没有使用是也是可以省略的。如果没有显示指定返回参数的值,那么它默认是0。
输入参数和输出参数可以在函数体中用作表达式。因此,它们也可用在等号左边被赋值。
pragma solidity ^0.4.16;
contract Simple {
function arithmetics(uint _a, uint _b)
public
pure
returns (uint o_sum, uint o_product)
{
o_sum = _a + _b;
o_product = _a * _b;
}
//省略返回参数的变量名定义
function output2(uint a, uint b) returns (uint){
return a + b;
}
//返回多个值
function returnMul(uint a) returns (uint, uint){
return (a, a + 1);
}
}
这个是官网的一个例子,返回值有多个。可能写c的人不太习惯,写Go的就明白好多。
在下面一篇会详细分析一下函数的使用和它的高级用法。
如果你对c++和区块链感兴趣,欢迎关注: