# 常量(constant state variables)
`狀態變量`可以被定義為`constant`,常量。這樣的話,它必須在編譯期間通過一個表達式賦值。賦值的表達式不允許:1)訪問`storage`;2)區塊鏈數據,如`now`,`this.balance`,`block.number`;3)合約執行的中間數據,如`msg.gas`;4)向外部合約發起調用。也許會造成內存分配副作用表達式是允許的,但不允許產生其它內存對象的副作用的表達式。內置的函數`keccak256`,`keccak256`,`ripemd160`,`ecrecover`,`addmod`,`mulmod`可以允許調用,即使它們是調用的外部合約。
允許內存分配,從而帶來可能的副作用的原因是因為這將允許構建復雜的對象,比如,查找表。雖然當前的特性尚未完整支持。
編譯器并不會為常量在`storage`上預留空間,每個使用的常量都會被對應的常量表達式所替換(也許優化器會直接替換為常量表達式的結果值)。
不是所有的類型都支持常量,當前支持的僅有值類型和字符串。
```
pragma solidity ^0.4.0;
contract C {
uint constant x = 32**22 + 8;
string constant text = "abc";
bytes32 constant myHash = keccak256("abc");
}
```
### 常函數(Constant Functions)
函數也可被聲明為常量,這類函數將承諾自己不修改區塊鏈上任何狀態。
```
pragma solidity ^0.4.0;
contract C {
function f(uint a, uint b) constant returns (uint) {
return a * (b + 42);
}
}
```
`訪問器(Accessor)`方法默認被標記為`constant`。當前編譯器并未強制一個`constant`的方法不能修改狀態。但建議大家對于不會修改數據的標記為`constant`。
- Solidity語言
- 入門說明
- Solidity智能合約文件結構
- 智能合約源文件的基本要素概覽
- 值類型
- 類型
- 布爾
- 整型
- 地址
- 字節數組
- 小數
- 字符串
- 十六進制字面量
- 枚舉
- 函數
- 引用類型
- 引用類型
- 數據位置
- 數組
- 數據結構
- 雜項
- 映射
- 左值運算符
- 類型間的轉換
- 類型推斷
- 單位
- 貨幣單位
- 時間單位
- 語言內置特性
- 特殊變量及函數
- 數學和加密函數
- 地址相關
- 進階
- 入參和出參
- 控制結構
- 函數調用
- 創建合約實例
- 表達式的執行順序
- 賦值
- 作用范圍和聲明
- 異常
- 內聯匯編
- 合約詳解
- 合約
- 可見性或權限控制
- 訪問函數
- 函數修改器
- 常狀態變量
- 回退函數
- 事件
- 繼承
- 接口
- 其它
- 庫
- 狀態變量的存儲模型
- 內存變量的存局
- 調用數據的布局