区块链开发之Solidity编程基础运算符
Posted BBinChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链开发之Solidity编程基础运算符相关的知识,希望对你有一定的参考价值。
运算法
运算符是一种特殊的符号,用来表示数据的运算、赋值和比较等,其实运算符是相对标准的,用法也基本跟其他语言无二义。
Solidity 运算符分以下几种:
- 算数运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 类型相关运算符
算数运算符
加法运算符
实例代码如下:
function add() public view
// 定义两个整型变量
int32 a = 1;
int32 b = 2;
// 整型变量相加
int32 c = a + b;
// 整型字面量相加
int32 d = 1 + 2;
// 小数字面量相加,小数字面相加的和必须为整型
int32 e = 1.5 + 1.5;
Solidity 没有浮点型变量,因此小数字面量用作算术运算时,最终结果必须为整型。
那么 e的值是多少呢?
减法运算符
实例代码如下:
function subtract() public view
// 定义两个整型变量
int32 a = 1;
int32 b = 2;
// 整型变量相减
int32 c = b - a;
// 整型字面量相减
int32 d = 2 - 1;
// 小数字面量相减,小数字面相减的结果必须为整型
int32 e = 2.5 - 1.5;
e的值是多少呢?
乘法运算符
示例代码如下:
function mul() public view
// 定义两个整型变量
int32 a = 1;
int32 b = 2;
// 整型变量相乘
int32 c = a * b;
// 整型字面量相乘
int32 d = 1 * 2;
// 小数字面量相乘,小数字面相乘的结果必须为整型
int32 e = 1.5 * 2;
e的值是多少呢?
除法运算符
1、除数(分母)不可为0
2、字面量相除,结果值同样为整数
3、结果值类型为整型时,除法结果取整数部分
示例代码如下:
function div() public view
// 定义两个整型变量
int32 a = 3;
int32 b = 2;
// 结果只保留整数部分,小数部分被忽略
int32 c = a / b;
// 整型字面量相除,d类型必须为整型
int32 d = 3 / 1;
// 小数字面量相除,小数字面相除的结果同须为整型
int32 e = 2.5 / 0.5;
求余运算符
示例代码如下:
function mod() public view
int32 a = 5;
int32 b = 4;
int32 c = a % b;
int32 d = 5 % 4;
int32 e = 3.5 % 0.5;
为什么这里不强调整型结果值了呢?难道这里比较特殊,要不你动动手跑一下代码?
乘方运算符
小数字面常数的乘方运算结果不是整数,因此该运算符不至此小数字面常数。同时乘方运算只支持无符号的整型变量。
示例代码如下:
function pow() public view
int32 a = 5;
int32 b = 4;
// 这里编译错误,因为乘方只支持无符号的整型变量
int32 c = a ** b;
uint32 e = 5;
uint32 f = 4;
// success
uint32 g = e ** f;
//
int32 h = 5 ** 4;
// 不支持小数字面常数运算
int32 i = 3.5 ** 0.5;
自加运算符
示例代码如下:
function selfAdd() public view
// 定义无符号的整型变量 a
uint32 a = 1;
// 将自加运算符放在a的右边,a 先参与运算,即赋值给b,再自加
// 运算结束后 b 为 2,a 为2
uint32 b = a++ + 1; //
// 将自加运算符放在a的左边,a 先执行自加,再参与运算后赋值给b
// 运算结束后,c 为 4, a 为 3
uint32 c = ++a + 1;
自减运算符
自减运算符也是单目运算符,用法与++一致。
示例代码如下:
function selfSubtract() public view
// 定义无符号的整型变量 a
uint32 a = 3;
// 将自减运算符放在a的右边,a 先参与运算,后赋值给b,再自减
// 运算结束后 b 为 2,a 为2
uint32 b = a-- - 1; //
// 将自减运算符放在a的左边,a 先执行自减,再参与运算,后赋值给b
// 运算结束后,c 为 0, a 为 1
uint32 c = --a - 1;
赋值运算符
赋值运算符用于为变量指定变量值,使用 = 作为赋值运算符。
可以使用赋值运算符口将一个字面量赋值给变量:
bytes3 value1 = "你好";
bytes5 value2 = "hello world";
也可以将一个变量的值赋给另外一个变量:
uint8 a = 1;
uint8 b = a;
还可以将表达式的值赋值给变量:
int32 a = 1;
int32 b = 2;
int32 c = a + b;
以及对多个变量赋值相同内容的连续赋值:
int32 a;
int32 b;
int32 c;
a = b = c = 1;
赋值运算符可与算术运算符、位运算符结合,扩展成功能更加强大的运算符。扩展后的复制运算符如下:
- += : a += b,等同于 a = a + b
- -= : a -= b,等同于 a = a - b
- *= : a _= b,等同于 a = a * b
- /= : a /= b,等同于 a = a / b
- %= :a %= b,等同于 a = a % b
- &= : a &= b,等同于 a = a & b
- |= : a |= b,等同于 a = a | b
- ^= : a ^= b,等同于 a = a ^ b
- <<= : a <<= b,等同于 a = a << b
- >>= :a >>= b,等同于 a = a >> b
位运算符
- << : 左移运算符
- >> : 右移运算符
- & : 按位与。当两位同时为 1 时才返回 1。
- ^ :按位异或。当两位相同时返回 0,不相同时返回 1。
- | :按位或。只要有一位为 1 即可返回 1。
位运算符只能操作整数类型的变量或整型字面常数。位运算符的运算规则如下表:
第一个操作数 | 第二个操作数 | 按位与 | 按位或 | 按位异或 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
示例代码如下:
function bitOperator() public view returns(uint32, uint32, uint32, uint32, uint32)
uint32 a = 3 & 1;
uint32 b = 2 | 1;
uint32 c = 2 ^ 1;
uint32 d = 3 >> 1;
uint32 e = 2 << 1;
//1, 3, 3,1, 4
return (a, b, c, d, e);
比较运算符
- > :大于,只支持左右两边操作数是数值类型。
- >= : 大于等于,只支持左右两边操作数是数值类型。
- < : 小于,只支持左右两边操作数是数值类型。
- <= : 小于等于,只支持左右两边操作数是数值类型。
- == : 等于,比较两个操作数是否相等,支持数值类型,字符串,定长字节数组。
- != : 不等于,比较两个操作数是否相等,支持数值类型,字符串,定长字节数组。
逻辑运算符
- && :与,前后两个表达式必须都是 true 才返回 true,否则返回 false。
- || :或,只要两个表达式中有一个是 true,就可以返回 true,否则返回 false。
- ! :非,也叫取反运算符,只需要一个操作数,如果操作数为 true,则返回 false;如果操作数为 false,则返回 true。
同其他语言,&&
和 ||
有短路性质,即 && 的第一个条件为false时,不会判断第二个条件, 而当|| 的第一个条件为true时,不会判断第二个条件
示例代码如下:
function logicOperator() public view returns(bool, bool, bool)
//
int32 x = 1;
int32 y = 2;
bool a = x > 0 && y >= 0;
bool b = x > 0 || y >= 3;
bool c = !(x > 2);
//true 、 true、true
return (a, b, c);
三目运算符
三目运算符的语法格式如下:
expression ? if-true-statement : if-false-statement;
先对逻辑表达式 expression
求值,如果逻辑表达式为 true,则返回 if-true-statement
部分,如果为 false,则返回if-false-statement
。
示例代码如下:
function trinocularOperator() public view returns(int32)
int32 x = 1;
int32 y = 2;
//get the max value
int32 a = x > y ? x : y;
//2
return a;
运算符的优先级
当组合语句比较复杂时,编程语言指定了优先级标准用于编译(解释)指令时进行合理排序
优先级 | 运算符说明 | 运算符 |
---|---|---|
1 | 单目运算符 | ++ – ~ ! |
2 | 乘法/除法/求余 | * / % |
3 | 加法/减法 | + - |
4 | 位移运算 | << >> |
5 | 关系运算符 | < <= >= > |
6 | 等价运算符 | == != |
7 | 按位与 | & |
8 | 按位异或 | ^ |
9 | 按位或 | | |
10 | 条件与 | && |
11 | 条件或 | || |
12 | 三目运算符 | ? : |
13 | 赋值 | = += -= *= /= = |= ^= %= <<= >>= |
以上是关于区块链开发之Solidity编程基础运算符的主要内容,如果未能解决你的问题,请参考以下文章