天天看點

深入了解Solidity——作用域和聲明作用域和聲明(Scoping and Declarations)

作用域和聲明(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