区块链开发之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。

位运算符只能操作整数类型的变量或整型字面常数。位运算符的运算规则如下表:

第一个操作数第二个操作数按位与按位或按位异或
00000
01011
10011
11110

示例代码如下:

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编程基础运算符的主要内容,如果未能解决你的问题,请参考以下文章

区块链开发之Solidity编程基础运算符

区块链开发之Solidity编程基础

区块链开发之Solidity编程基础

区块链开发之Solidity编程基础

区块链开发之Solidity编程基础合约数据存储

区块链开发之Solidity编程基础合约语句及函数修饰符