【Solidity学习笔记】动态定义数据类型——关键词var

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的范围,程序报错。

你可能感兴趣的:(【Solidity学习笔记】动态定义数据类型——关键词var)