Solidity語言學習筆記————14、左值運算子

FLy_鵬程萬里發表於2018-06-22

左值運算子(Operators Involving LValues)

如果a是一個左值(LValues),即一個可以賦值給它的變數,可以使用以下的運算子:

  • a += e相當於 a = a + e。 運算子- =* =/ =% =| =& =^ = 都有類似的定義。
  • a++a--相當於a+ = 1 /a - = 1,
  • --a++aa有與上一條相同的效果,但是等值發生改變後才返回運算結果。

刪除(delete)

  • delete a將對應型別的初始值賦值給a,即相當於a= 0
  • 對於靜態陣列使用delete時,是將陣列內所有元素置為初值。而對於動態陣列時,則是將長度置為0。
  • 對於結構體使用delete會將其中的所有成員變數一一置為初值。
  • deletemapping沒有效果(因為對映的金鑰可以是任意的,並且通常是未知的)。因此,如果delete一個struct,將重置所有不是對映的mapping,也會遞迴到成員中,除非它們是對映。不過,單獨的鍵和鍵對應的值可以被delete

注意,delete a的行為非常類似於對a賦值,即a中儲存了一個新的物件:

pragma solidity ^0.4.0;

contract DeleteExample {
    uint data;
    uint[] dataArray;

    function f() public {
        uint x = data;
        delete x; // sets x to 0, does not affect data
        delete data; // sets data to 0, does not affect x which still holds a copy
        uint[] storage y = dataArray;
        delete dataArray; // this sets dataArray.length to zero, but as uint[] is a complex object, also
        // y is affected which is an alias to the storage object
        // On the other hand: "delete y" is not valid, as assignments to local variables
        // referencing storage objects can only be made from existing storage objects.
    }
}

相關文章