如果 a
是一個 LValue(即一個變數或者其它可以被賦值的東西),以下運算符都可以使用簡寫:
a += e
等同於 a = a + e
。 其它運算子 -=
, *=
, /=
, %=
, |=
,&=
以及 ^=
都是如此定義的。a++
和 a--
分別等同於 a += 1
和 a -= 1
,但表達式本身的值等於 a
在計算之前的值。 與之相反,--a
和 ++a
雖然最終a
的結果與之前的表達式相同,但表達式的返回值是計算之後的值
delete a
的結果是將類型初始值賦值給 a
。
a=0
delete a[x]
僅刪除陣列索引處x
的元素,其他的元素和長度不變,這以為著陣列中留出了一個空位。a
是結構體,則將結構體中的所有屬性(成員)重置換句話說,在 delete a
之後的值與在沒有賦值的情況下聲明 a
的情況相同, 但需要注意以下幾點:
delete
對整個映射是無效的(因為映射的鍵可以是任意的,通常也是未知的)。 因此在你刪除一個結構體時,結果將重置所有的非映射屬性(成員),這個過程是遞歸進行的,除非它們是映射。 然而,單個的鍵及其映射的值是可以被刪除的delete a
的效果就像是給 a
賦值很重要,換句話說,這相當於在a
中存儲了一個新的物件// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.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
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.
assert(y.length == 0);
}
}