智能推断:
使用var关键字时,第一次赋值给变量,编译器会自动推断变量的类型,而且推断后不能更改这个变量的类型了,如果更改了就会出错,还有就是不能在函数参数中使用。注意:有时候var会推断出一个错误的类型。
案例:
pragma solidity ^0.4.18;
contract Var{
function vardemo() view returns(bool){
var a = true;
return a;
}
}
结果为:
solidity中var 推断类型时,遵循就地最小的原则,也就是说,推断uint类型时,它会默认选择最小的。
案例:
pragma solidity ^0.4.18;
contract Var{
function vardemo() view returns(uint){
var a = 7 ;
a=256;
return a;
}
}
这样的话,就会报错:
之后赋值的数据在 这个类型以内就可以。。
var可以将函数赋值给一个变量
pragma solidity ^0.4.18;
contract Var{
function vardemo() view returns(bool){
var a = true ;
return a;
}
function vardemo2() view returns(bool){
var b=vardemo;
return b();
}
}
16进制
16进制字面量:比如Address类型定义的地址就是16进制。
特点:hexencodingto...函数,以关键字hex开头,后面跟一些字符串,比如hex"001122"
案例:
contract Hex{
function hexdemo()view returns(string){
var a=hex"00112233";
return a;
}
}
16进制与bytes转换,转换完成后也可以通过下标来取其指定的元素值。
案例:
contract Hex{
function hexdemo()view returns(string){
var a=hex"00112233";
return a;
}
function hexdemo1()view returns(bytes4,bytes1,bytes1){
bytes4 a=hex"00112233";
return (a,a[0],a[3]);
}
}
常量和变量
常量:在solidity中,并不是所有的的类型都支持常量,只有值类型与string类型支持。
string constant a ="wek";
常量定义时要注意需要声明数据类型。
变量:
变量位置:
memory:存储在内存中
storage:永久存储在区块链上
calldata:不用再程序中指定,只要是calldata中的数据,它都是只读的,并不持久化到区块链上,一般在外部函数才会指定。
存储位置说明:状态变量默认存储在storage上面,函数中的局部变量也会存储在storage上面,函数的参数和返回值会存储在memory上面。
数据位置转换:
memory ->memory 引用传递,会改变其源数据的值。
memory->storage 不会改变源数据的值。
storage->memory 数据拷贝 会改变源数据的值。
storage->storage 会改变源数据的值。
contract dataLocal{
uint[5] x = [1,2,3,4,5];
uint[5] y;
// 1. memory->memory
function gmemory() view public returns(uint[5]){
uint[5] memory s = x;
fmemory(s);
return s;
}
function fmemory(uint[5] y) {
y[0] = 30;
}
// 2. memory->storage
function mToS() view public returns(uint[5]) {
uint[5] memory s = x;
y = s;
y[0] = 100;
return s;
}
// 函数里面的变量,会直接引发错误,因为这本身是一个非法操作
function inFunc(uint[] x) {
uint[] y;
y = x;
}
// 3. storage->storage
function St(uint[5] storage y) internal {
y[0] = 20;
}
function g() view returns(uint[5]) {
St(x);
return x;
}
// 4. storage->memory
}
枚举
特点:用户的自定义类型,,枚举可以显示的与整形进行转换,显示的转换会在运行时检测数值范围,如果范围不匹配会引发异常,枚举类型至少要有一个成员。
默认从0开始,注:不能与整型进行隐式的转换。
enum主要描述产品是否用过(new,used)
enum ProductCondition{
New,
Used
}
案例:
该实例结合struct和enum,生成struct对象,在生成struct对象的过程中使用enum类型:
pragma solidity ^0.4.13;
contract Store{
struct Product{
ProductCondition condition;
}
enum ProductCondition{
New,
Used
}
function getProductCondition() public pure returns (ProductCondition){
Product memory product = Product(ProductCondition.Used);
return product.condition;
}
}
从这个实例可以看出,如果构建Product结构体传入ProductCondition.Used则返回1,ProductCondition.New返回0