本教程使用的開發環境是一款在線編譯器——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。