33

Solidity 编程指南:变量和作用域

 5 years ago
source link: https://mp.weixin.qq.com/s/jW3uXMeGRVelL3qjBZqXOg?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这是solidity编程指南系列文章,还在编写中,请访问http://doc.cocolian.cn/coco/ 阅读当前进度,谢谢。有任何问题,请在文下留言。 感谢您的支持。

一、变量定义

在Solidity中,每一个变量都有类型(type), 在声明变量时,变量的类型在变量名之前:

uint8 age;
boolean done;
uint32 salary;

变量申明必须以分号结束,他们也是一条完整的语句;

当然,也可以在定义变量的时候对其初始化:

uint8 age = 12;
boolean done = false;
uint32 salary = 10293894;

在Solidity中,变量声明尽可能靠近其第一次使用的地方。这是一个良好的编写风格。

二、块

在solidity中,由{}括起来的若干条简单语句就是块。 它确定了变量的作用域。 一个块可以嵌套的另一个块里面,在solidity中,如果在子块中重新定义了父块中的变量,则会出现编译错误,remix会编译不通过:

  function testBlock() public {
        uint a = 12;
        uint b = 13;
        if(b>1){
            uint a = 14; //变量a已经定义过了。 
            return ;
        }
    }

三、初始值

在solidity中,所有变量在定义的时候,如果未指定初始值,系统都会默认其值为所有字节都是0的初始值,也就是典型的 0状态 默认值。

  • 布尔类型默认为 false;

  • 有符号和无符号整型默认为0;

  • 固定大小数组,所有元素都按类型默认为0;

  • 动态数组,默认为为空数组或者字符串。

四、作用域

注意,solidity和其他语言不同地方在于:

  1. 变量在函数中可以先使用后声明;

  2. 一个变量的作用域,不是在它声明的块中,而是在其声明的整个函数中。

  3. 变量在任何一个地方声明,那在这个函数进入时,就会被初始化,初始化为系统默认值,而不是变量声明的时候指定的值。

  4. 同一个变量在一个函数中不能被重复声明。

contract ScopingErrors {
    function scoping() {
        uint i = 0;

        while (i++ < 1) {
            uint same1 = 0; // 作用域是从这里开始,到本函数结束。 
        }

        while (i++ < 2) {
            uint same1 = 0;// 这是错误的,重复声明了same1;
        }
    }

    function minimalScoping() {
        {
            uint same2 = 0;
        }

        {
            uint same2 = 0;// 这是错误的,重复声明了same2;
        }
    }

    function forLoopScoping() {
        for (uint same2 = 0; same2 < 1; same2++) { //这是没问题的,和上一个i是在不同函数中,作用域是到这个函数结束
        }

        for (uint same2 = 0; same2 < 1; same2++) {// 这是错误的,重复声明了same2。 
        }
    }

    function initVariables() returns (uint) {
        uint bar = 5; //注意,这里声明和初始化了bar,值为5。但foo也会在函数开始的时候初始化,值是0。 
        if (true) {
            bar += foo; //虽然foo 在后面声明,但这里已经可以使用了。 
        } else {
            uint foo = 10;// 这个语句不会被执行。foo会在函数开始的时候执行初始化,值是0,而不是10。
        }
        return bar;// returns 5
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK