Solidity语言学习——(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/The_Reader/article/details/83064528

布尔类型

跟其他语言一样,取值范围为:ture与false

Address类型

  1. 代表以太坊的地址,长度为20个字节,160位 ,uint160是所有地址都可以用的类型

话不多说,直接上案例:


contract addr {
    
    address  addr=0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
    function getsenderaddr()view returns(address){
        return msg.sender;
    }
    
}

 

注意account账户

得到得地址为account地址。

好了,言归正传。。。。

Address类型用脚丫子想想就知道它并不支持四则运算。但是呢,它支持比较 ,还有一些它支持的属性。

话不多说,还是案例:

contract addr {
    
    
    function getsenderaddr()view returns(address){
        return msg.sender;
    }
    
    
    address  addr=0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
    function compare() view returns(bool){
        return addr>msg.sender;
        
    }
    
}

 

结果为false,我猜,身为读者的你,肯定会想为什么为false。

那么我来告诉你。这是两个地址的比较

address  addr       =0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
address  addrcurrnt =0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;

 它的原理为除了开头的0x,它会先比较8与C,16进制都知道C代表着12,肯定比8大,所以结果为false。如果第一个都是c它会比较后边的,以此类推。

好了,言归正传。。

Address 拥有自己的成员,比如,balance 余额。

  function getbalance() view returns(uint){
        
        return addrcurrnt.balance ;
    }

 

这就是它的balance余额。

Address还有自己的方法,send()是转账时调用的。向某个地址发送货币。

send有个递归深度,不能超过1024。gas(手续费)不够的话会send失败!

contract addr {
    
    
    function getsenderaddr()view returns(address){
        return msg.sender;
    }
    
    
    address  addr=0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
    address addrcurrnt=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
    function compare() view returns(bool){
        return addr>msg.sender;
    }
    
    
    function getbalance() view returns(uint){
        
        return addrcurrnt.balance ;
    }
    
    
    function chongzhi()payable returns(bool){
        
        return address(this).send(msg.value);
    }
    
}

 

 

可以看到vlaue充值成功。但是返回值为false,你知道为什么吗?

在solidity中没有单精度,双精度类型。

定长字节数组

表现形式:bytes,从bytes[1]开始到bytes[32],步长为1.bytes默认表示bytes[1],

而且bytes支持比较,和逻辑运算。

声明,初始化请看下面案例:

contract bytesdemo{
    
    bytes1 a=0x8c;
    bytes3 b=0xc3c18c;
    
    function compare() view returns(bool){
        return a>b;
    }
    
}

逻辑运算 

contract bytesdemo{
    
    bytes1 a=0x8c;
    bytes3 b=0xc3c18c;
    
    function compare() view returns(bool){
        return a>b;
    }
    
    bytes1 c = 0xaa;
    function and() view returns(bytes1){
        return a & c; 
    }
    
}

定长数组也有自己的属性

length

    function getlength()view returns(uint){
        
        return a.length;
    }

bytes的长度在其定义好后并不能使用length去修改。否则会报错。

string字符串

string可以说是一个特殊的不定长的数组

如果读者学过c语言的话,你就会知道C语言中字符串得长度在其末尾会有个结尾符,但solidity中字符串没有结尾符,字符串有多少位,其长度就是多少位。

做个小案例吧,这样直观一些。

contract stringdemo{
    string name ="wek";
    function getlength()view returns(uint){
        return bytes(name).length;
    
    }
}

 

细心得读者可以发现返回值位uint类型,其默认的位数位256。

案例中也包含着类型转换。由string类型转换位bytes类型。

转换位bytes类型后,就可以获取string数据的长度,也可以获取指定下标的元素值,也可以改变指定下标的元素值。

contract bytestostring{
    string name="wek";
    
    function stb() view returns(bytes){
        return bytes(name);
    }
    bytes bt=stb();
    
    function bts()view returns(string){
        bytes memory newbt = new bytes(bt.length);
        for (uint8 index = 0;index<bt.length;index++){
            newbt[index]=bt[index];
        }
        return string(newbt);
        
    }
}

如果将bytes直接转的话会出错,所以需要开辟新内存,并new一个bytes然后再string(bytes)。

猜你喜欢

转载自blog.csdn.net/The_Reader/article/details/83064528