企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 作用范围和声明(Scoping And Decarations) 一个变量在声明后都有初始值为字节表示的全0值。也就是所有类型的默认值是典型的`零态(zero-state)`。举例来说,默认的`bool`的值为`false`,`uint`和`int`的默认值为`0`。 对从`byte1`到`byte32`定长的字节数组,每个元素都被初始化为对应类型的初始值(一个字节的是一个字节长的全0值,多个字节长的是多个字节长的全零值)。对于变长的数组`bytes`和`string`,默认值则为空数组和空字符串。 函数内定义的变量,在整个函数中均可用,无论它在哪里定义)。因为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 } } ```