函數(shù)參數(shù),包括返回值的默認(rèn)數(shù)據(jù)存儲(chǔ)位置是memory。
局部變量的默認(rèn)數(shù)據(jù)存儲(chǔ)位置是storage。
狀態(tài)變量默認(rèn)數(shù)據(jù)存儲(chǔ)位置強(qiáng)制為storage
使用new創(chuàng)建的memory的數(shù)組,不能使用length改變長(zhǎng)度
改小數(shù)組長(zhǎng)度,被移除的元素會(huì)被銷(xiāo)毀
function f() returns (uint, bool, uint) {
return (7, true, 2);
}
(data.length,) = f(); // Sets the length to 7 設(shè)定長(zhǎng)度為7
(,data[3]) = f(); // Sets data[3] to 2 將data[3] 設(shè)為2
在函數(shù)中任何位置聲明的變量,它的作用域?yàn)檎麄€(gè)函數(shù),與聲明位置無(wú)關(guān)
(1)在以下情況下會(huì)生成assert風(fēng)格異常:
以過(guò)大或負(fù)數(shù)索引訪問(wèn)數(shù)組(比如x[i] ,i >= x.length 或 i < 0)
以過(guò)大或負(fù)數(shù)索引訪問(wèn)固定長(zhǎng)度的bytesN。
除數(shù)或模數(shù)為零(例如5/0或23%0)。
對(duì)負(fù)數(shù)進(jìn)行位移
將過(guò)大或負(fù)數(shù)轉(zhuǎn)化為枚舉類(lèi)型。
調(diào)用內(nèi)部函數(shù)類(lèi)型的0初始化(zero-initialized)變量。
assert的條件為false
(2)在以下情況下會(huì)生成require風(fēng)格異常:
調(diào)用throw
調(diào)用require并且條件為false
通過(guò)消息調(diào)用來(lái)調(diào)用函數(shù),但是它沒(méi)有正確完成(即,用盡了gas,沒(méi)有匹配的函數(shù),或者拋出了異常),除非使用底層別的操作call,send,delegatecall或callcode。 底層別的操作不會(huì)拋出異常,而是通過(guò)返回false來(lái)表示失敗。
使用new關(guān)鍵字創(chuàng)建合約但是失敗。
執(zhí)行一個(gè)外部函數(shù)調(diào)用,其指向不包含代碼的合約。
合約通過(guò)public函數(shù)接收Ether,但沒(méi)有payable修飾符。包括構(gòu)造函數(shù)和回退函數(shù)。
合約通過(guò)一個(gè)public的getter函數(shù)接收Ether。
如果.transfer()失敗。
(3)assert風(fēng)格的異常消耗調(diào)用中可用的所有g(shù)as,而require風(fēng)格的異常將不會(huì)消耗從Metropolis版本開(kāi)始的任何gas。
編譯器會(huì)自動(dòng)為所有public狀態(tài)變量創(chuàng)建getter函數(shù)。
getter函數(shù)具有外部可見(jiàn)性。
如果在內(nèi)部訪問(wèn)符號(hào)(即不使用this.關(guān)鍵字),則將其作為狀態(tài)變量。
如果它是外部訪問(wèn)的(即使用this.),則將其作為函數(shù)。