作用范围和声明(Scoping And Decarations)

优质
小牛编辑
136浏览
2023-12-01

一个变量在声明后都有初始值为字节表示的全0值。也就是所有类型的默认值是典型的零态(zero-state)。举例来说,默认的bool的值为false,uintint的默认值为0

对从byte1byte32定长的字节数组,每个元素都被初始化为对应类型的初始值(一个字节的是一个字节长的全0值,多个字节长的是多个字节长的全零值)。对于变长的数组bytesstring,默认值则为空数组和空字符串。

函数内定义的变量,在整个函数中均可用,无论它在哪里定义)。因为Solidity使用了javascript的变量作用范围的规则。与常规语言语法从定义处开始,到当前块结束为止不同。由此,下述代码编译时会抛出一个异常,Identifier already declared

pragma solidity ^0.4.0;
contract ScopingErrors {
    function scoping() {
        uint i = 0;
        while (i++ < 1) {
            uint same1 = 0;
        }
        while (i++ < 2) {
            uint same1 = 0;// Illegal, second declaration of same1
        }
    }
    function minimalScoping() {
        {
            uint same2 = 0;
        }
        {
            uint same2 = 0;// Illegal, second declaration of same2
        }
    }
    function forLoopScoping() {
        for (uint same3 = 0; same3 < 1; same3++) {
        }
        for (uint same3 = 0; same3 < 1; same3++) {// Illegal, second declaration of same3
        }
    }
    
    function crossFunction(){
       uint same1 = 0;//Illegal
    }
}

另外的,如果一个变量被声明了,它会在函数开始前被初始化为默认值。所以下述例子是合法的。

pragma solidity ^0.4.0;
contract C{
    function foo() returns (uint) {
    // baz is implicitly initialized as 0
    uint bar = 5;
    if (true) {
        bar += baz;
    } else {
        uint baz = 10;// never executes
    }
    return bar;// returns 5
}
}