Solidity语法基础学习

五、映射类型:

映射型态

Mapping Type

映射钥匙Key → 真实资料 Value

mapping(KeyType → ValueType) VariableName

·关键字:mapping

  ·宣告一个映射,后面需定义钥匙(Key)与资料(Value)的型态

·KeyType

  ·只能使用“内建型态(int,uint,……)”、“bytes”、“string”,或者“contract”与“列举enum型态”。

  ·不支持“使用者自定义”或“复杂”的型态,如“映射mapping”、“结构structs”或“阵列arry”

·ValueType

  ·可以是任何型态

  ·各种值的预设值:

    字串→预设值→空

    数字→预设值→0

    布尔值→预设值→0/false

mapping的原理

·所有的value都会被初始化成“预设值”。

  ·原因是在以太坊的空间上,所有未初始化的空间,都是0,换言之就是每个型态被迪定义的“预设置”。

·Key并不会被存在mapping型态里,因此使用者没办法从mapping中取得所有的Key

·那他是怎么查询的呢?

  ·keccak256(Key)→Value

·因此,mapping没有办法记录长度、大小、在没有key的情况下也不能列出所有的value

Example:学号与成绩

·建立一份合约class

·建立一个映射,将学号映射到成绩中:

  ·学号uint

  ·成绩uint

·提供一个函数update来更新学生成绩

  ·update(uint student_id,uint score)

·提供一个函数getScore来取得学生成绩

  ·get(uint students_id) → uint score

代码示例:

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17; contract Class {
mapping(uint => uint) Students;
function update(uint id,uint score) public {
Students[id] = score;
}
function set(uint id) public view returns(uint) {
return Students[id];
}
}

六、循环体:

控制结构

Control Structure

前言:在程序中会遇见同一件事情需要用很多次,需要重复很多次,这时不可能将代码复制很多次,就需用“控制结构”进行控制。

·关键词:if

  ·当满足“条件”的时候,则执行“{}内的代码”

·条件必须是个“布尔值”

  ·也就是逻辑判断,如:未满十八岁、是否高于最低薪资、论文有无抄袭、参考资料有无正确引用等。

若“000”,则“XXX”,否则“ZZZ”

if(条件){/*做点事儿*/} else{/*做点儿别的事儿*/}

·关键字:if-else

  ·当满足“条件”的时候,则执行“{}内的代码”

  ·若不满足“条件”则执行“else{}内的代码”

很多条件的情况

if(条件A){} else if (条件B){}……

·关键字:if-(else-if)*-else

·当有多个条件时,可以排序多个条件,else不一定要有

Example:成绩计算(if)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17; contract Class {
//声明一个列表然后将值赋予列表
uint[] Scores = [90,91,92,93,94];
//定义一个函数X,这个函数公开可见可读可写,作用是返回一个无符号整数,输出元素计算总和,同时index自加一直到预设条件
function X() public view returns(uint) {
//这里将Sum预设值归零
uint Sum = 0;
//这里将index预设值归零
uint index = 0;
//这里开始while循环体
while (index < 5) {
//这里是Sum将Score中的每一个元素输出并相加
Sum = Sum + Scores[index];
//index自加确保在列表元素输出完后,能够跳出循环
index++;
}
//最终返回总和
return Sum;
}
}

重复做事 for

for (宣告;条件;事后修改的事) {/*做点事儿*/}

·关键字:for(  ;  ;  ){}

  ·在满足条件下,重复执行{}内的代码。

·宣告:

  ·循环事实上就是计数器,因此宣告是为了帮助我们制造出计数器的变数,计数器不一定是整数,只要能被利用在“条件判断中”的型态都可以使用。

  ·要遍历阵列的所有元素:for (uint index;  ;  )  {……}

·条件:同if

·事后修改的事:比如说增加计数器等修改的行为。

·若“条件”没写,则为一个“无限循环”是停不下来的。

Example:统计学生成绩(for)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17; contract Class {
uint[] Score = [90,91,92,93,94];
function X() public view returns(uint) {
//声明一个Sum变量,将其预设值归零
uint Sum = 0;
//这里for循环结构是(宣告;条件;事后修改的值){执行代码}
//事实上这里宣告就是声明一个可以结束循环体的循环控制值
for ( uint index = 0;index < 5;index++ ) {
Sum = Sum + Score[index];
}
return Sum;
}
}

重复做事 while

·关键字:while( ) { }

·在特定条件下,重复执行{ }内的代码。

·条件:同if

·若“条件”没写,则为一个“无限循环”是停不下来的。

Example:统计成绩(while)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17; contract Class {
uint[] Score = [90,91,92,93,94];
function X() public view returns(uint) {
//声明一个Sum变量,将其预设值归零
uint Sum = 0;
//这里for循环结构是(宣告;条件;事后修改的值){执行代码}
//事实上这里宣告就是声明一个可以结束循环体的循环控制值
for ( uint index = 0;index < 5;index++ ) {
Sum = Sum + Score[index];
}
return Sum;
}
}

离开当前循环 break

break

·关键字:break

  · 跳出当前循环

·若嵌套状态,如for( ){for( ){for( ){ } } },就需要三个break。

跳出本次循环 continue

continue

·关键字:continue;

  ·跳过本次循环

    ·在“for”时,跳过以后会执行“事后修改的事”;

    ·在“while”时,就会跳回条件判断

  ·当执行到continue的时候,会无条件跳过continue后的代码。

区块链特辑——solidity语言基础(三)的更多相关文章

  1. 比原链CTO James | Go语言成为区块链主流开发语言的四点理由

    11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...

  2. C语言基础三(敲打键盘、寻找资料,循环语句)

    有人在学C语言或者其他语言的时候,大家都会说逻辑思维的硬道理,认为没有逻辑思维的人走不远,那么小编这里借助简单的if...else... 英文解释if(如果),else(否则) ----------- ...

  3. Solidity语言基础 和 Etherum ERC20合约基础

    1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的,  小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...

  4. C语言基础三

    C--数组 一维数组的定义和引用 定义:类型说明符 数组名[常量表达式] int a[ 10 ];他表示定义了一个整形数组,数组名为a,有10个元素. 注意:C语言不允许对数组的大小做动态定义. 一维 ...

  5. python自动化--语言基础三字典、函数、全局/局部变量

    字典 dict1 = {,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values()) #打印所有的values值 pri ...

  6. Go语言基础三:基本数据类型和运算符

    Go语言数据类型 与其他编程语言一样,Go语言提供了各种数据类型,可分为基本的数据类型和复杂的数据类型.基本的数据类型就是基本的构造块,例如字符串.数字和布尔值.复杂的数据类型是用户自己定义的结构,由 ...

  7. 001/Go语言构建区块链(mooc)

    1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑 ...

  8. 从Go语言编码角度解释实现简易区块链

    区块链技术 人们可以用许多不同的方式解释区块链技术,其中通过加密货币来看区块链一直是主流.大多数人接触区块链技术都是从比特币谈起,但比特币仅仅是众多加密货币的一种. 到底什么是区块链技术? 从金融学相 ...

  9. 以太坊区块链Java(EthereumJ)学习笔记:概述

    本系列文章介绍以太坊区块链基于Java语言的解决方案.通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助. 整体架构 以太坊的Java解决方案主要 ...

  10. VRF在区块链中的应用

    最近区块链领域流行了一种"怪病",许多区块链项目或者设计方案都加入了一个叫做VRFs的算法.那么, (1) 什么是VRFs? (2) VRFs在区块链中解决了什么问题? 本文旨在介 ...

随机推荐

  1. java多线程的两种创建方式

    方式一:继承Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()方法---> 将此线程执行的操作声明在run()中 3.创建Thread类的子类的对象 4. ...

  2. 集合元素的遍历操作,使用迭代器Iterator接口

    1.内部的方法:hasNext() 和 next() 推荐的方式: //hasNext():判断是否还有下一个元素while(iterator.hasNext()){ //next():①指针下移 ② ...

  3. NOIP2017总结 & 题解

    day1t1的结论貌似在哪见过,自己稍微验证了一下貌似没记错就没有管了.t2一道很好(keng)的模拟题啊t3自己做题好慢啊,想出来dp打上去最后几分钟才过了大样例,我写的是记忆化搜索,判-1很好判, ...

  4. mybatis-特殊查询

    特殊SQL的执行 模糊查询 /** * 根据用户名进行模糊查询 * @param username * @return java.util.List<com.atguigu.mybatis.po ...

  5. Python基础之函数:6、异常相关和生成器对象、yield用法、生成器表达式

    目录 一.异常常见类型 1.类型错误 2.缩进错误 3.索引错误 4.语法错误 5.属性错误 6.key键错误 二.异常处理语法结构 1.基本语法结构 2.查看错误类型 3.针对不同类型所作措施 4. ...

  6. GY91(MPU9250 + BMP280)惯性传感器开发指南

    目录 参考资料 I2C 设备ID 关键数据读取 MPU6500:读取加速度数据&换算单位 BMP280: 读取温度和气压信息 & 单位换算 推荐库 参考资料 参考资料说明: 用户手册时 ...

  7. Python学习之实例2

    一.根据输入的各科成绩统计学生成绩是否达标 1 (背景:输入学生数量,以及各个学生语文.数学.英语.历史四科的成绩,如果总成绩小于 240,则成绩不达标,否则成绩合格) 2 3 #coding=utf ...

  8. Java安全之Mojarra JSF反序列化

    Java安全之Mojarra JSF反序列化 About JSF JavaServer Faces,新一代的Java Web应用技术标准,吸收了很多Java Servlet以及其他的Web应用框架的特 ...

  9. layui的switch监听事件无用

    像layui的这种表单事件是属于表单,而不是表格,所以操作是layui.form.on监听事件,而不是用layui.table.on table = layui.table , form = layu ...

  10. 万字长文!对比分析了多款存储方案,KeeWiDB最终选择自己来

    大数据时代,无人不知Google的"三驾马车"."三驾马车"指的是Google发布的三篇论文,介绍了Google在大规模数据存储与计算方向的工程实践,奠定了业界 ...