Solidity 运算符

本章学习 Solidity 中的运算符。

视频Bilibili  |  Youtube
官网binschool.app
推特@BinSchool    DiscordBinDAO   微信:bkra50 

Solidity 支持多种运算符,用于对变量和表达式执行数学计算、条件判断、位操作和赋值等操作。

Solidity 支持的运算法包括 6 类:算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、条件运算符。

其中,算术运算符、比较运算符、逻辑运算符最为常用,需要熟练掌握。

1. 算术运算符

算术运算符用于执行基本的数学运算,对数字进行加法、减法、乘法和除法等操作。

假设变量 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,等同于 A+1 = 11
7 -- (递减)   递减运算,例如: A--= 9,等同于 A-1 = 9
8 ** (幂)   幂运算,例如: A**3,等同于 A*A*A = 1000

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract OperatorMaths {
  int a = 10;
  int b = 20;
  function add() public view returns(int){ 
    return a+b; // 结果为 30
  } 
  function sub() public view returns(int){ 
    return a-b; // 结果为 -10
  } 
  function mul() public view returns(int){ 
    return a*b; // 结果为 200
  }
  function div() public view returns(int){ 
    return a/b; // 结果为 0
  } 
  function mod() public view returns(int){ 
    return a%b; // 结果为 10
  }
  function increase() public returns(int){ 
    a++;
    return a; // 结果为 11
  }
  function decrease() public returns(int){ 
    a--;
    return a; // 结果为 9
  }  
  function exp() public returns(int){ 
    return a**3; // 结果为 1000
  }  
}

2. 比较运算符

比较运算符用于比较两个值之间的关系,并返回一个布尔值。

假设变量 A 的值为 10,变量 B 的值为 20,那么执行比较运算后的结果如下表。

序号 运算符与描述
1 == (等于)   例如: A == B,结果为 false
2 != (不等于)   例如: A != B,结果为 true
3 > (大于)   例如: A > B,结果为 false
4 < (小于)   例如: A < B,结果为 true
5 >= (大于等于)   例如: A > B,结果为 false
6 <= (小于等于)   例如: A <= B,结果为 true

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract OperatorCompare {
  int a = 10;
  int b = 20;
  function equal() public view returns(bool){ 
    return a==b; // 结果为 false
  } 
  function notEqual() public view returns(bool){ 
    return a!=b; // 结果为 true
  } 
  function greater() public view returns(bool){ 
    return a>b; // 结果为 false
  }
  function less() public view returns(bool){ 
    return a<b; // 结果为 true
  } 
  function greaterOrEqual() public view returns(bool){ 
    return a>=b;  // 结果为 false
  }
  function lessOrEqual() public view returns(bool){ 
    return a<=b;  // 结果为 true
  } 
}

3. 逻辑运算符

逻辑运算符用于在条件表达式组合和操作布尔值。

逻辑运算符经常用于条件语句、循环语句和布尔表达式中,通过逻辑关系决定执行路径,来实现复杂的流程控制。

假设变量 A 的值为 true,变量 B 的值为 false,那么执行比较运算后的结果如下表。

序号 运算符与描述
1 && (逻辑与)  如果两个操作数都为 true,则返回 true;否则返回 false。  例如: (A && B) 为 false。
2 || (逻辑或)  如果至少一个操作数为 true,则返回 true;否则返回 false。  例如: (A || B) 为 true。
3 ! (逻辑非)  将布尔值取反,如果操作数为true,则返回false;如果操作数为false,则返回true。  例如: !A 为 false。

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract OperatorLogic {
  bool a = true;
  bool b = false;
  function and() public view returns(bool){ 
    return a&&b; // 结果为 false
  } 
  function or() public view returns(bool){ 
    return a||b; // 结果为 true
  } 
  function not() public view returns(bool){ 
    return !a; // 结果为 false
  }
}

4. 位运算符

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。

5. 赋值运算符

赋值运算符用于将一个值赋给变量或表达式。我们平时使用最多的就是简单赋值 “=”,其它的赋值运算符仅仅起到简写的作用,都可以使用简单赋值代替。

序号 运算符与描述
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。

6. 条件运算符

条件运算符是一个三元运算符,用于根据条件的真假选择不同的值。

这是一种简洁的表达式形式,可以由条件语句来代替。

序号 运算符与描述
1 ? : (条件运算符 )   例如:C?X :Y如果条件 C 为真 ,则取前一个值 X,否则取后一个值 Y。

例如:

uint value = status==1?100:200;

如果 status 的值为 1,那么 value 的值就是 100。

如果 status 的值不为 1,那么 value 的值就等于 200。