Solidity 运算符
让我们看一个简单的表达式:
这里
4和
5称为操作数,
+称为运算符。Solidity 支持以下类型的运算符:
算术运算符
比较运算符
逻辑(或关系)运算符
赋值运算符
条件(或三元)运算符
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 比较运算符
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 "0";
}
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 逻辑运算符
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 "0";
}
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 位运算符
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 "0";
}
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 赋值运算符
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 "0";
}
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 条件运算符
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 "0";
}
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 – 第一个程序中的步骤,运行上述程序。
输出