# 左值的相關運算符
`左值`,是指位于表達式左邊的變量,可以是與操作符直接結合的形成的,如自增,自減;也可以是賦值,位運算。
可以支持操作符有:`-=`,`+=`,`*=`,`%=`,`|=`,`&=`,`^=`,`++`,`--`。
## 特殊的運算符delete
`delete`運算符,用于將某個變量重置為初始值。對于整數,運算符的效果等同于`a = 0`。而對于定長數組,則是把數組中的每個元素置為初始值,變長數組則是將長度置為0。對于結構體,也是類似,是將所有的成員均重置為初始值。
`delete`對于映射類型幾乎無影響,因為鍵可能是任意的,且往往不可知。所以如果你刪除一個結構體,它會遞歸刪除所有非mapping的成員。當然,你是可以單獨刪除映射里的某個鍵,以及這個鍵映射的某個值。
需要強調的是`delete a`的行為更像賦值,為`a`賦予一個新對象。我們來看看下文的示例:
```
pragma solidity ^0.4.0;
contract DeleteExample {
uint data;
uint[] dataArray;
function f() {
//值傳遞
uint x = data;
//刪除x不會影響data
delete x;
//刪除data,同樣也不會影響x,因為是值傳遞,它存的是一份原值的拷貝。
delete data;
//引用賦值
uint[] y = dataArray;
//刪除dataArray會影響y,y也將被賦值為初值。
delete dataArray;
//下面的操作為報錯,因為刪除是一個賦值操作,不能向引用類型的storage直接賦值從而報錯
//delete y;
}
}
```
通過上面的代碼,我們可以看出,對于值類型,是值傳遞,刪除`x`不會影響到`data`,同樣的刪除`data`也不會影響到`x`。因為他們都存了一份原值的拷貝。
而對于復雜類型略有不同,復雜類型在賦值時使用的是引用傳遞。刪除會影響所有相關變量。比如上述代碼中,刪除`dataArray`同樣會影響到`y`。
由于`delete`的行為更像是賦值操作,所以不能在上述代碼中執行`delete y`,因為不能對一個storage的引用賦值。
[http://solidity.readthedocs.io/en/develop/types.html#operators-involving-lvalues](http://solidity.readthedocs.io/en/develop/types.html#operators-involving-lvalues)
strorage的引用不能賦值原因,可以看看關于數據位置的這篇文章:[http://me.tryblockchain.org/solidity-data-location.html。](http://me.tryblockchain.org/solidity-data-location.html%E3%80%82)?
- Solidity語言
- 入門說明
- Solidity智能合約文件結構
- 智能合約源文件的基本要素概覽
- 值類型
- 類型
- 布爾
- 整型
- 地址
- 字節數組
- 小數
- 字符串
- 十六進制字面量
- 枚舉
- 函數
- 引用類型
- 引用類型
- 數據位置
- 數組
- 數據結構
- 雜項
- 映射
- 左值運算符
- 類型間的轉換
- 類型推斷
- 單位
- 貨幣單位
- 時間單位
- 語言內置特性
- 特殊變量及函數
- 數學和加密函數
- 地址相關
- 進階
- 入參和出參
- 控制結構
- 函數調用
- 創建合約實例
- 表達式的執行順序
- 賦值
- 作用范圍和聲明
- 異常
- 內聯匯編
- 合約詳解
- 合約
- 可見性或權限控制
- 訪問函數
- 函數修改器
- 常狀態變量
- 回退函數
- 事件
- 繼承
- 接口
- 其它
- 庫
- 狀態變量的存儲模型
- 內存變量的存局
- 調用數據的布局