智能合約語(yǔ)言Solidity語(yǔ)法詳解 - 類型介紹1

最新內(nèi)容會(huì)更新在主站深入淺出區(qū)塊鏈社區(qū)
原文鏈接:智能合約語(yǔ)言 Solidity 教程系列1 - 類型介紹

現(xiàn)在的Solidity中文文檔躺翻,要么翻譯的太爛,要么太舊担租,決定重新翻譯下。
尤其點(diǎn)名批評(píng)極客學(xué)院名為《Solidity官方文檔中文版》的翻譯,機(jī)器翻譯的都比它好涩嚣,大家還是別看了。

寫在前面

Solidity是以太坊智能合約編程語(yǔ)言掂僵,閱讀本文前航厚,你應(yīng)該對(duì)以太坊、智能合約有所了解锰蓬,如果你還不知道這些概念歡迎訂閱專欄:區(qū)塊鏈技術(shù)
Solidity語(yǔ)法的介紹會(huì)是一系列文章幔睬,本文是第一篇:介紹Solidity的變量類型。

本文前半部分是參考Solidity官方文檔(當(dāng)前最新版本:0.4.20)進(jìn)行翻譯芹扭,前半部分是實(shí)際合約代碼實(shí)例說(shuō)明類型的使用(僅針對(duì)專欄訂閱用戶)麻顶。

類型

Solidity是一種靜態(tài)類型語(yǔ)言赦抖,意味著每個(gè)變量(本地或狀態(tài)變量)需要在編譯時(shí)指定變量的類型(或至少可以推倒出類型)。Solidity提供了一些基本類型可以用來(lái)組合成復(fù)雜類型辅肾。

Solidity類型分為兩類:

  • 值類型(Value Type) - 變量在賦值或傳參是队萤,總是進(jìn)行值拷貝。
  • 引用類型(Reference Types)

值類型(Value Type)

值類型包含:

  • 布爾類型(Booleans)
  • 整型(Integers)
  • 定長(zhǎng)浮點(diǎn)型(Fixed Point Numbers)
  • 定長(zhǎng)字節(jié)數(shù)組(Fixed-size byte arrays)
  • 有理數(shù)和整型常量(Rational and Integer Literals)
  • 字符串常量(String literals)
  • 十六進(jìn)制常量(Hexadecimal literals)
  • 枚舉(Enums)
  • 函數(shù)(Function Types)
  • 地址(Address)
  • 地址常量(Address Literals)

函數(shù)和地址講解會(huì)在之后的文章矫钓。

布爾類型(Booleans)

布爾(bool):可能的取值為常量值truefalse要尔。

布爾類型支持的運(yùn)算符有:

  • !邏輯非
  • && 邏輯與
  • || 邏輯或
  • == 等于
  • != 不等于

注意:運(yùn)算符&&||是短路運(yùn)算符新娜,如f(x)||g(y)赵辕,當(dāng)f(x)為真時(shí),則不會(huì)繼續(xù)執(zhí)行g(shù)(y)概龄。

整型(Integers)

int/uint: 表示有符號(hào)和無(wú)符號(hào)不同位數(shù)整數(shù)匆帚。支持關(guān)鍵字uint8uint256 (以8步進(jìn)),
uintint 默認(rèn)對(duì)應(yīng)的是 uint256int256旁钧。

支持的運(yùn)算符:

  • 比較運(yùn)算符: <=, < , ==, !=, >=, > (返回布爾值:true 或 false)
  • 位操作符: &吸重,|,^(異或)歪今,~(位取反)
  • 算術(shù)操作符:+嚎幸,-,一元運(yùn)算-寄猩,一元運(yùn)算+嫉晶,,/, %(取余數(shù)), **(冪), << (左移位), >>(右移位)

說(shuō)明:

  1. 整數(shù)除法總是截?cái)嗟奶锲绻\(yùn)算符是字面量(字面量稍后講)替废,則不會(huì)截?cái)唷?/li>
  2. 整數(shù)除0會(huì)拋異常。
  3. 移位運(yùn)算的結(jié)果的正負(fù)取決于操作符左邊的數(shù)泊柬。x << y 和 x * 2**y 是相等椎镣, x >> y 和 x / 2*y 是相等的。
  4. 不能進(jìn)行負(fù)移位兽赁,即操作符右邊的數(shù)不可以為負(fù)數(shù)状答,否則會(huì)拋出運(yùn)行時(shí)異常。

注意:Solidity中刀崖,右移位是和除等價(jià)的惊科,因此右移位一個(gè)負(fù)數(shù),向下取整時(shí)會(huì)為0亮钦,而不像其他語(yǔ)言里為無(wú)限負(fù)小數(shù)馆截。

定長(zhǎng)浮點(diǎn)型(Fixed Point Numbers)

注意:定長(zhǎng)浮點(diǎn)型 Solidity(發(fā)文時(shí))還不完全支持,它可以用來(lái)聲明變量蜂莉,但不可以用來(lái)賦值蜡娶。

fixed/ufixed: 表示有符號(hào)和無(wú)符號(hào)的固定位浮點(diǎn)數(shù)堪唐。關(guān)鍵字為ufixedMxNufixedMxN
M表示這個(gè)類型要占用的位數(shù)翎蹈,以8步進(jìn),可為8到256位男公。
N表示小數(shù)點(diǎn)的個(gè)數(shù)荤堪,可為0到80之前

支持的運(yùn)算符:

  • 比較運(yùn)算符: <=, < , ==, !=, >=, > (返回布爾值:true 或 false)
  • 算術(shù)操作符:+,-枢赔,一元運(yùn)算-澄阳,一元運(yùn)算+,踏拜,/, %(取余數(shù))
    注意:它和大多數(shù)語(yǔ)言的float和double不一樣碎赢,
    M*是表示整個(gè)數(shù)占用的固定位數(shù),包含整數(shù)部分和小數(shù)部分速梗。因此用一個(gè)小位數(shù)(M較邪谷)來(lái)表示一個(gè)浮點(diǎn)數(shù)時(shí),小數(shù)部分會(huì)幾乎占用整個(gè)空間姻锁。

定長(zhǎng)字節(jié)數(shù)組(Fixed-size byte arrays)

關(guān)鍵字有:bytes1, bytes2, bytes3, ..., bytes32枕赵。(以步長(zhǎng)1遞增)
byte代表bytes1。

支持的運(yùn)算符:

  • 比較符: <=, <, ==, !=, >=, > (返回bool)
  • 位操作符: &, |, ^ (按位異或)位隶,~(按位取反), << (左移位), >> (右移位)
  • 索引(下標(biāo))訪問(wèn): 如果x是bytesI拷窜,當(dāng)0 <= k < I ,則x[k]返回第k個(gè)字節(jié)(只讀)涧黄。

移位運(yùn)算和整數(shù)類似篮昧,移位運(yùn)算的結(jié)果的正負(fù)取決于操作符左邊的數(shù),且不能進(jìn)行負(fù)移位笋妥。

成員變量:
.length:表示這個(gè)字節(jié)數(shù)組的長(zhǎng)度(只讀)懊昨。

變長(zhǎng)(動(dòng)態(tài)分配大小)字節(jié)數(shù)組(Dynamically-sized byte array)

  • bytes:動(dòng)態(tài)分配大小字節(jié)數(shù)組, 參見(jiàn)Arrays,不是值類型!
  • string:動(dòng)態(tài)分配大小UTF8編碼的字符類型,參看Arrays春宣。不是值類型!

根據(jù)經(jīng)驗(yàn):
bytes用來(lái)存儲(chǔ)任意長(zhǎng)度的字節(jié)數(shù)據(jù)疚颊,string用來(lái)存儲(chǔ)任意長(zhǎng)度的(UTF-8編碼)的字符串?dāng)?shù)據(jù)。
如果長(zhǎng)度可以確定信认,盡量使用定長(zhǎng)的如byte1到byte32中的一個(gè)材义,因?yàn)檫@樣更省空間。

有理數(shù)和整型常量(Rational and Integer Literals)

也有人把Literals翻譯為字面量

整型常量是有一系列0-9的數(shù)字組成嫁赏,10進(jìn)制表示其掂,比如:8進(jìn)制是不存在的,前置0在Solidity中是無(wú)效的潦蝇。

10進(jìn)制小數(shù)常量(Decimal fraction literals)帶了一個(gè).款熬, 在.的兩邊至少有一個(gè)數(shù)字深寥,有效的表示如:1., .11.3.

科學(xué)符號(hào)也支持,基數(shù)可以是小數(shù)贤牛,指數(shù)必須是整數(shù)惋鹅, 有效的表示如: 2e10, -2e10, 2e-10, 2.5e1

數(shù)字常量表達(dá)式本身支持任意精度殉簸,也就是可以不會(huì)運(yùn)算溢出闰集,或除法截?cái)唷5?dāng)它被轉(zhuǎn)換成對(duì)應(yīng)的非常量類型般卑,或者將他們與非常量進(jìn)行運(yùn)算武鲁,則不能保證精度了。
如:(2*800 + 1) - 2*800的結(jié)果為1(uint8整類) 蝠检,盡管中間結(jié)果已經(jīng)超過(guò)計(jì)算機(jī)字長(zhǎng)沐鼠。另外:.5 * 8的結(jié)果是4,盡管有非整形參與了運(yùn)算叹谁。

只要操作數(shù)是整形饲梭,整型支持的運(yùn)算符都適用于整型常量表達(dá)式。
如果兩個(gè)操作數(shù)是小數(shù)焰檩,則不允許進(jìn)行位運(yùn)算排拷,指數(shù)也不能是小數(shù)。

注意:
Solidity對(duì)每一個(gè)有理數(shù)都有一個(gè)數(shù)值常量類型锅尘。整數(shù)常量和有理數(shù)常量從屬于數(shù)字常量监氢。所有的數(shù)字常表達(dá)式的結(jié)果都屬于數(shù)字常量。所以1 + 2和2 + 1都屬于同樣的有理數(shù)的數(shù)字常量3

警告:
整數(shù)常量除法藤违,在早期的版本中是被截?cái)嗟睦烁F(xiàn)在可以被轉(zhuǎn)為有理數(shù)了,如5/2的值為 2.5

注意:
數(shù)字常量表達(dá)式顿乒,一旦其中含有常量表達(dá)式议街,它就會(huì)被轉(zhuǎn)為一個(gè)非常量類型。下面代碼中表達(dá)式的結(jié)果將會(huì)被認(rèn)為是一個(gè)有理數(shù):

uint128 a = 1;
uint128 b = 2.5 + a + 0.5;

上述代碼編譯不能通過(guò)璧榄,因?yàn)閎會(huì)被編譯器認(rèn)為是小數(shù)型特漩。

字符串常量

字符串常量是指由單引號(hào),或雙引號(hào)引起來(lái)的字符串 ("foo" or 'bar')骨杂。字符串并不像C語(yǔ)言涂身,包含結(jié)束符,"foo"這個(gè)字符串大小僅為三個(gè)字節(jié)搓蚪。和整數(shù)常量一樣蛤售,字符串的長(zhǎng)度類型可以是變長(zhǎng)的。字符串可以隱式的轉(zhuǎn)換為byte1,...byte32 如果適合,也會(huì)轉(zhuǎn)為bytes或string悴能。

字符串常量支持轉(zhuǎn)義字符揣钦,比如\n,\xNN漠酿,\uNNNN冯凹。其中\(zhòng)xNN表示16進(jìn)制值,最終轉(zhuǎn)換合適的字節(jié)炒嘲。而\uNNNN表示Unicode編碼值宇姚,最終會(huì)轉(zhuǎn)換為UTF8的序列。

十六進(jìn)制常量(Hexadecimal literals)

十六進(jìn)制常量摸吠,以關(guān)鍵字hex打頭,后面緊跟用單或雙引號(hào)包裹的字符串嚎花,內(nèi)容是十六進(jìn)制字符串寸痢,如hex"001122ff"。
它的值會(huì)用二進(jìn)制來(lái)表示紊选。

十六進(jìn)制常量和字符串常量類似啼止,也可以轉(zhuǎn)換為字節(jié)數(shù)組。

枚舉(Enums)

在Solidity中兵罢,枚舉可以用來(lái)自定義類型献烦。它可以顯示的轉(zhuǎn)換與整數(shù)進(jìn)行轉(zhuǎn)換,但不能進(jìn)行隱式轉(zhuǎn)換卖词。顯示的轉(zhuǎn)換會(huì)在運(yùn)行時(shí)檢查數(shù)值范圍巩那,如果不匹配,將會(huì)引起異常此蜈。枚舉類型應(yīng)至少有一名成員即横。下面是一個(gè)枚舉的例子:

pragma solidity ^0.4.0;

contract test {
    enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
    ActionChoices choice;
    ActionChoices constant defaultChoice = ActionChoices.GoStraight;

    function setGoStraight() {
        choice = ActionChoices.GoStraight;
    }

    // Since enum types are not part of the ABI, the signature of "getChoice"
    // will automatically be changed to "getChoice() returns (uint8)"
    // for all matters external to Solidity. The integer type used is just
    // large enough to hold all enum values, i.e. if you have more values,
    // `uint16` will be used and so on.
    function getChoice() returns (ActionChoices) {
        return choice;
    }

    function getDefaultChoice() returns (uint) {
        return uint(defaultChoice);
    }
}

代碼實(shí)例

通過(guò)合約代碼實(shí)例說(shuō)明類型的使用,請(qǐng)前往區(qū)塊鏈技術(shù)小專欄查看全文鏈接裆赵。

參考視頻

我們也推出了目前市面上最全的視頻教程:深入詳解以太坊智能合約語(yǔ)言Solidity

目前我們也在招募體驗(yàn)師东囚,可以點(diǎn)擊鏈接了解。

參考文檔

Solidity官方文檔-類型

深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈战授,打造最好的區(qū)塊鏈技術(shù)博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末页藻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子植兰,更是在濱河造成了極大的恐慌份帐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楣导,死亡現(xiàn)場(chǎng)離奇詭異弥鹦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門彬坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朦促,“玉大人,你說(shuō)我怎么就攤上這事栓始∥衩幔” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵幻赚,是天一觀的道長(zhǎng)禀忆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)落恼,這世上最難降的妖魔是什么箩退? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮佳谦,結(jié)果婚禮上戴涝,老公的妹妹穿的比我還像新娘。我一直安慰自己钻蔑,他們只是感情好啥刻,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著咪笑,像睡著了一般可帽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窗怒,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天映跟,我揣著相機(jī)與錄音,去河邊找鬼扬虚。 笑死申窘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孔轴。 我是一名探鬼主播剃法,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼路鹰!你這毒婦竟也來(lái)了贷洲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晋柱,失蹤者是張志新(化名)和其女友劉穎优构,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體雁竞,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钦椭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年拧额,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪腔。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侥锦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出德挣,到底是詐尸還是另有隱情恭垦,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布格嗅,位于F島的核電站番挺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屯掖。R本人自食惡果不足惜玄柏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贴铜。 院中可真熱鬧粪摘,春花似錦、人聲如沸阀湿。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陷嘴。三九已至,卻和暖如春间坐,著一層夾襖步出監(jiān)牢的瞬間灾挨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工竹宋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劳澄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓蜈七,卻偏偏與公主長(zhǎng)得像秒拔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子飒硅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本章將會(huì)介紹 模塊和源文件訪問(wèn)級(jí)別訪問(wèn)控制語(yǔ)法自定義類型子類常量三娩、變量庵芭、屬性、下標(biāo)構(gòu)造器協(xié)議擴(kuò)展泛型類型別名位運(yùn)算...
    寒橋閱讀 888評(píng)論 0 2
  • 關(guān)于 Swift 重要這個(gè)文檔所包含的準(zhǔn)備信息, 是關(guān)于開(kāi)發(fā)的 API 和技術(shù)的雀监。這個(gè)信息可能會(huì)改變, 根據(jù)這個(gè)文...
    無(wú)灃閱讀 4,320評(píng)論 1 27
  • 1 關(guān)鍵字 1.1 關(guān)鍵字的概述 Java的關(guān)鍵字對(duì)java的編譯器有特殊的意義双吆,他們用來(lái)表示一種數(shù)據(jù)類型,或...
    哈哈哎呦喂閱讀 661評(píng)論 0 0
  • ?1 C語(yǔ)言程序的結(jié)構(gòu)認(rèn)識(shí) 用一個(gè)簡(jiǎn)單的c程序例子,介紹c語(yǔ)言的基本構(gòu)成好乐、格式匾竿、以及良好的書寫風(fēng)格,使讀者對(duì)c語(yǔ)...
    CONLYOUC閱讀 8,710評(píng)論 9 66
  • 前一段時(shí)間看到不少人在技術(shù)論壇里問(wèn)「剛學(xué) Android 不久曹宴,對(duì) Gradle 不懂搂橙,看了很多資料依然一知半解」...
    f9dd77add98e閱讀 3,522評(píng)論 1 8