Solidity – 算术运算符

Solidity 支持的算术运算符,如下表所示:

假设变量A的值为10,变量B的值为20。

序号 运算符与描述
1 + (加)
求和
例: A + B = 30
2 – (减)
相减
例: A – B = -10
3 * (乘)
相乘
例: A * B = 200
4 / (除)
相除
例: B / A = 2
5 % (取模)
取模运算
例: B % A = 0
6 ++ (递增)
递增
例: A++ = 11
7 — (递减)
递减
例: A– = 9

示例

下面的代码展示了如何使用算术运算符。

pragma solidity ^0.5.0;

contract SolidityTest {
constructor() public{
}
function getResult() public view returns(uint){
uint a = 1;
uint b = 2;
uint result = a + b; // 算术运算
return result;
}
}

Solidity – 比较运算符

Solidity 支持的比较运算符,如下表所示:

序号 运算符与描述
1 == (等于)
2 != (不等于)
3 > (大于)
4 < (小于)
5 >= (大于等于)
6 <= (小于等于)

下面的代码展示了如何使用比较运算符。

pragma solidity ^0.5.0;

contract SolidityTest {
uint storedData;
constructor() public{
storedData = 10;
}
function getResult() public view returns(string memory){
uint a = 1; // 局部变量
uint b = 2;
uint result = a + b;
return integerToString(result);
}
function integerToString(uint _i) internal pure
returns (string memory _uintAsString) { if (_i == 0) { // 比较运算符
return "";
}
uint j = _i;
uint len; while (j != 0) { // 比较运算符
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1; while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);// 访问局部变量
}
}

Solidity – 逻辑运算符

Solidity 支持的逻辑运算符,如下表所示:

假设变量A的值为10,变量B的值为20。

序号 运算符与描述
1 && (逻辑与)
如果两个操作数都非零,则条件为真。
例: (A && B) 为真
2 || (逻辑或)
如果这两个操作数中有一个非零,则条件为真。
例: (A || B) 为真
3 ! (逻辑非)
反转操作数的逻辑状态。如果条件为真,则逻辑非操作将使其为假。
例: ! (A && B) 为假

示例

下面的代码展示了如何使用逻辑运算符

pragma solidity ^0.5.0;

contract SolidityTest {
uint storedData; // 状态变量
constructor() public{
storedData = 10;
}
function getResult() public view returns(string memory){
uint a = 1; // 局部变量
uint b = 2;
uint result = a + b;
return integerToString(storedData); // 访问状态变量
}
function integerToString(uint _i) internal pure
returns (string memory) { if (_i == 0) {
return "";
}
uint j = _i;
uint len; while (!(j == 0)) { // 逻辑运算符
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1; while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
}

Solidity – 位运算符

Solidity 支持的位运算符,如下表所示:

假设变量A的值为2,变量B的值为3。

序号 运算符与描述
1 & (位与)
对其整数参数的每个位执行位与操作。
例: (A & B) 为 2.
2 | (位或)
对其整数参数的每个位执行位或操作。
例: (A | B) 为 3.
3 ^ (位异或)
对其整数参数的每个位执行位异或操作。
例: (A ^ B) 为 1.
4 ~ (位非)
一元操作符,反转操作数中的所有位。
例: (~B) 为 -4.
5 << (左移位))
将第一个操作数中的所有位向左移动,移动的位置数由第二个操作数指定,新的位由0填充。将一个值向左移动一个位置相当于乘以2,移动两个位置相当于乘以4,以此类推。
例: (A << 1) 为 4.
6 >> (右移位)
左操作数的值向右移动,移动位置数量由右操作数指定
例: (A >> 1) 为 1.

示例

下面的代码展示了如何使用位运算符

pragma solidity ^0.5.0;

contract SolidityTest {
uint storedData;
constructor() public{
storedData = 10;
}
function getResult() public view returns(string memory){
uint a = 2; // 局部变量
uint b = 2;
uint result = a & b; // 位与
return integerToString(result);
}
function integerToString(uint _i) internal pure
returns (string memory) {
if (_i == 0) {
return "";
}
uint j = _i;
uint len; while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1; while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);// 访问局部变量
}
}

Solidity – 赋值运算符

Solidity 支持的赋值运算符,如下表所示:

序号 运算符与描述
1 = (简单赋值)
将右侧操作数的值赋给左侧操作数
例: C = A + B 表示 A + B 赋给 C
2 += (相加赋值)
将右操作数添加到左操作数并将结果赋给左操作数。
例: C += A 等价于 C = C + A
3 −= (相减赋值)
从左操作数减去右操作数并将结果赋给左操作数。
例: C -= A 等价于 C = C – A
4 *= (相乘赋值)
将右操作数与左操作数相乘,并将结果赋给左操作数。
例: C *= A 等价于 C = C * A
5 /= (相除赋值)
将左操作数与右操作数分开,并将结果分配给左操作数。
例: C /= A 等价于 C = C / A
6 %= (取模赋值)
使用两个操作数取模,并将结果赋给左边的操作数。
例: C %= A 等价于 C = C % A

注意 – 同样的逻辑也适用于位运算符,因此它们将变成<<=>>=>>=&=|=^=

下面的代码展示了如何使用赋值运算符。

pragma solidity ^0.5.0;

contract SolidityTest {
uint storedData;
constructor() public{
storedData = 10;
}
function getResult() public view returns(string memory){
uint a = 1;
uint b = 2;
uint result = a + b;
return integerToString(storedData);
}
function integerToString(uint _i) internal pure
returns (string memory) {
if (_i == 0) {
return "";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10; // 赋值运算
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;// 赋值运算
}
return string(bstr); // 访问局部变量
}
}

Solidity – 条件运算符

Solidity 支持条件运算符。

序号 运算符与描述
1 ? : (条件运算符 )
如果条件为真 ? 则取值X : 否则值Y

示例

下面的代码展示了如何使用这个运算符

pragma solidity ^0.5.0;

contract SolidityTest {
uint storedData;
constructor() public{
storedData = 10;
}
function getResult() public view returns(string memory){
uint a = 1; // 局部变量
uint b = 2;
uint result = (a > b? a: b); //条件运算
return integerToString(result);
}
function integerToString(uint _i) internal pure
returns (string memory) {
if (_i == 0) {
return "";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
}

参考区块链入门到实战(31)之Solidity – 第一个程序运行

区块链入门到实战(36)之Solidity – 运算符的更多相关文章

  1. 区块链入门到实战(38)之Solidity – 条件语句

    Solidity支持条件语句,让程序可以根据条件执行不同的操作.条件语句包括: if if...else if...else if 语法 if (条件表达式) { 被执行语句(如果条件为真) } 示例 ...

  2. 区块链入门到实战(37)之Solidity – 循环语句

    与其他语言类似,Solidity语言支持循环结构,Solidity提供以下循环语句. while do ... while for 循环控制语句:break.continue. Solidity – ...

  3. 区块链入门到实战(34)之Solidity – 变量

    Solidity 支持三种类型的变量: 状态变量 – 变量值永久保存在合约存储空间中的变量. 局部变量 – 变量值仅在函数执行过程中有效的变量,函数退出后,变量无效. 全局变量 – 保存在全局命名空间 ...

  4. 区块链入门到实战(30)之Solidity – 基础语法

    一个 Solidity 源文件可以包含任意数量的合约定义.import指令和pragma指令. 让我们从一个简单的 Solidity 源程序开始.下面是一个 Solidity 源文件的例子: prag ...

  5. 区块链入门到实战(28)之Solidity – 介绍

    Solidity语言是一种面向合约的高级编程语言,用于在以太坊区块链网络上实现智能合约.Solidity语言深受c++.Python和JavaScript的影响,针对以太坊(Ethereum)虚拟机( ...

  6. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  7. 区块链入门到实战(22)之以太坊(Ethereum) – 账号(地址)

    作用: 外部账号 – 用户使用的账号,账户余额. 合约账号 – 智能合约使用的账号,每个智能合约都有一个账号,内存和账户余额 以太坊(Ethereum)网络中,有2种账号: 外部账号 – 用户使用的账 ...

  8. 区块链入门到实战(20)之以太坊(Ethereum) – 虚拟机(E.V.M.)

    作用:执行智能合约代码的引擎 以太坊(Ethereum)虚拟机是执行智能合约代码的引擎. 可以用某种语言,例如Solidity语言,开发智能合约程序,编译成以太坊(Ethereum)虚拟机支持的字节码 ...

  9. 区块链入门到实战(26)之以太坊(Ethereum) – 挖矿

    以太坊(Ethereum)与其他公共区块链一样,使用工作量证明机制确保区块链网络正常运行. 矿工进行工作量证明计算,即挖矿,来选择区块,写入区块链,确认交易. 交易过程如下图所示: 从技术角度来看,以 ...

随机推荐

  1. Skill 返回一个数字list的大小排序信息

    https://www.cnblogs.com/yeungchie/ code procedure(ycSortList(numlist) prog((size sort) foreach(main ...

  2. 7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树

    LINK:qiqi20021026的T1 考场上只拿到了50分的\(nq\)暴力. 考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高. 先考虑LCS的问题 常见解决方法是后缀数组/tri ...

  3. Android html5和Android之间的交互

    今天补充了会昨天的问题,然后搞半天又出现莫名其妙的问题. 今天讲的是交互,先说html5在Android的调用. 上面的hello world上面的部分都是安卓里的布局 然后按这些布局自动生成代码. ...

  4. Qt 中十六进制字节流转换为Base64编码

    在Qt中,在网络通信时,有时需要将16进制字节流转换为Base64编码传输,在Qt的QByteArray类中,提供了与Base64转换的接口: //16进制字节流转为Base64 QByteArray ...

  5. 曲线生成与求交—B样条曲线

    B样条曲线生成 Bezier曲线缺点:改变任一控制点的位置,将影响整条曲线的形状. B样条曲线是对Bezier曲线的改进,可进行局部控制,生成的曲线与控制多边形的外形更接近,将Bezier曲线作为一特 ...

  6. http接口封装mqtt协议

    前言 .Net Core 3.1 WebApi 列出了mqtt客户端的封装目的是为了了解运作机制 1.封装mqtt客户端 mqtt底层协议基于MQTTnet 版本2.8.5 github地址 实例化[ ...

  7. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

  8. C#设计模式之1-工厂方法模式

    工厂方法模式(Factory Method Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/389 访问 ...

  9. JS实例-DOM查询

    <!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...

  10. 不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序

    一般我们写好了应用程序想要部署发布它,要么发布到物理机,要么发布到虚拟机,要么发布到容器来运行它.现在有了Azure应用服务,我们可以完全不用管这些东西,只管写好自己的代码,然后使用VisualStu ...