变量初始化
1、初始化的值
值类型
- bool的默认值为false
- bytes32的默认值为32字节长的0
- uint默认为0
- address默认为0x0
对于引用类型
- bytes类型默认值为空字节数组
- string为默认值为空串
- 动态数组uint8[] memory arr为空。
2、 声明后使用方式
值类型
- 对于值类型,声明变量后,即赋值为默认值,可直接使用。
引用类型如下讨论
(1) 动态数组
对于动态数组,声明后,仍需分配内存后方可访问
下给出正确的使用方式:
pragma solidity ^0.4.0;
contract ArrayInitialOk{
function f() returns (bytes1, uint8){
bytes memory bs = new bytes(1); //使用new关键字分配空间
uint8[] memory arr = new uint8[](1);
return (bs[0], arr[0]);//分配空间之后,才可访问元素
}
}
(2)映射
映射的声明后,不用显式初始化即可直接使用,只是对应的值都是初始化的值
(3)枚举
枚举类型不用显式初始化,默认值将为0。即顺位第一个值。
(4)结构体
结构体声明后,不用显式初始化即可使用。当没有显式初始化时,其成员值均为默认值。
作用域问题:
变量无论在函数内什么位置定义,其作用域均为整个函数,而非大多数据语言常见的块级作用域。
【一些特殊的例子就是,虽然没有执行到,但是只要有声明的语句,对应的值就会被初始化】
pragma solidity ^0.4.0;
contract FunctionScope2{
function f() returns (uint8){
if(false){
uint8 foo = 10;
}
return foo;
}
}
返回结果: