左值运算符(Operators Involving LValues)
如果a
是一个左值(LValues),即一个可以赋值给它的变量,可以使用以下的运算符:
a += e
相当于a = a + e
。 运算符- =
,* =
,/ =
,% =
,| =
,& =
和^ =
都有类似的定义。a++
和a--
相当于a+ = 1
/a - = 1
,--a
和++a
对a
有与上一条相同的效果,但是等值发生改变后才返回运算结果。
删除(delete)
delete a
将对应类型的初始值赋值给a
,即相当于a= 0
。- 对于静态数组使用
delete
时,是将数组内所有元素置为初值。而对于动态数组时,则是将长度置为0。 - 对于结构体使用
delete
会将其中的所有成员变量一一置为初值。 delete
对mapping
没有效果(因为映射的密钥可以是任意的,并且通常是未知的)。因此,如果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. } }