作用域和聲明(Scoping and Declarations)
- 已聲明的變量将具有其位元組表示為全0的初始值。
- 變量的初始值是任何類型的典型“零狀态”(“zero-state)。例如,
的初始值為bool
。false
或uint
類型的預設值為 。int
- 對于靜态大小的數組和
到bytes1
,每個單獨的元素将被初始化為對應于其類型的初始值。bytes32
- 對于動态大小的數組、
和bytes
,初始值是空數組或空字元串。string
在函數中任何位置聲明的變量,它的作用域為整個函數,與聲明位置無關。這是因為Solidity繼承了JavaScript的作用域規則。這與許多語言相反——變量僅作用于聲明的地方直到語句塊的末尾為止。
是以,下面的代碼是非法的,導緻編譯器抛出一個錯誤,辨別符已經聲明:
// 以下代碼無法編譯
pragma solidity ^.16;
contract ScopingErrors {
function scoping() public {
uint i = ;
while (i++ < ) {
uint same1 = ;
}
while (i++ < ) {
uint same1 = ;// 非法,重複聲明same1
}
}
function minimalScoping() public {
{
uint same2 = ;
}
{
uint same2 = ;// 非法,重複聲明same2
}
}
function forLoopScoping() public {
for (uint same3 = ; same3 < ; same3++) {
}
for (uint same3 = ; same3 < ; same3++) {// 非法,重複聲明same3
}
}
}
除此之外,如果變量被聲明,則在函數的開頭将其初始化為其預設值。是以,以下代碼是合法的,盡管寫得不好:
pragma solidity ^.0;
contract C {
function foo() public pure returns (uint) {
// baz隐式初始化為0
uint bar = ;
if (true) {
bar += baz;
} else {
uint baz = ;// 永遠不會執行
}
return bar;// 傳回 5
}
}
上一篇:深入了解Solidity——函數調用和指派
下一篇:深入了解Solidity——Assert, Require, Revert 和 Exceptions