var
用于动态定义数据类型,建议尽量少用。
举个栗子:
var a = true; //bool型
a = 1; //上一行赋值,a被定义成了bool型,再次赋值其他数据类型时,编译会报错
var b = 0; //uint8型
var c = 'hello world'; //string型
如上,a,b,c在合约中第1次被赋值成什么类型的数据,就决定了它们各自的类型。
遇到的坑
pragma solidity ^0.4.17;
contract Test
{
function testVar() constant returns (uint8) {
uint8 a = 100;
var b = a; //b为uint8类型
return b; //返回uint8 100
}
function testVar1() constant returns (uint16) {
uint8 a = 100;
var b = a; //b为uint8类型
return b; //返回uint16 100,因为uint16>uint8的存储范围,返回时做了转换
}
function testVar2() constant returns (string) {
uint8 a = 100;
var b = a; //b为uint8类型
return b; //编译报错,因为b的类型与returns定义的类型不相同,且不能转换
}
//遇到了坑
function testVar3() constant returns (uint8) {
uint8 a;
for(var i = 0; i<=255; i++) { //i被定义成了uint8,当i=255且运行完for循环里面代码时,执行i++则超出了uint8的范围,报错
a = i;
}
return a;
}
}
如上代码,var i=0等价于给i定义成了uint8类型,当i=255且运行完for循环里面代码时,执行i++则超出了uint8的范围,程序报错。
网友评论