实验5.1 状态变量与局部变量

《道德经》第八十章最后一句“邻国相望,鸡狗之声相闻,民至老死,不相往来。”在Solidity中,变量存储的地方与引用的类型往往就决定着两者的关系。它们开辟的内存空间,就像相隔的小岛,如果没有特殊的情况,基本上互不干扰,过着安定祥和的生活。

实验目的

1. 了解solidity中状态变量与局部变量的在存取上的区别。

实验要求

1. 查看示例1的代码,回答注释后的三个问题,将你的答案填入后面的括号内。然后进行编译部署,调用test与changeAge函数,查看结果,思考变量i和age分别是什么类型传递。

2. 查看示例2,回答注释后的问题,将答案填入后面的括号内。编译部署成功后,调用test函数。再调用test2与test3函数,查看结果。思考状态变量与局部变量存储的区别。

以下是本次实验所使用到的测试代码,请使用remix编辑器完成该实验

// 示例1
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MemoryTest {
//这里声明的是什么存储类型的变量age?  (1)
uint public age = 20;  
    function add(uint num) public pure returns(uint){
        num += 1;
        return num;
}
// test函数中add(i)函数对i进行了加一的操作,请问return的i的值还是2吗?(2)        
    function test() public pure returns(uint,uint){
        uint i = 2;
        uint j = add(i);
        return (i,j);   
}

//函数changeAge中add(age)函数对age进行了加一的操作,请问age的值还是20吗?   (3)
    function changeAge() public view {
        add(age);
    }
}
// 示例2
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 
contract StorageTest{ 
    uint[] public arrx; 
    function test(uint[] memory arry) public returns(uint){ 
        arrx = arry; 
        uint[] storage z = arrx;
        z[0] = 100;
        // z.length = 100;
        return z[0]; 
}
//执行test函数后,arrx索引为0的值会变吗? 值是多少?  (1)
    function test2() public view returns(uint){
        return arrx[0]; 
}
//执行test函数后,arrx的长度会变吗?   (2)
    function test3() public view returns(uint){
    return arrx.length;
    }
}

下面是本次实验所配套的视频教程: