スマートコントラクトプログラミング言語であるSolidityの演算子について記載します。
Solidity 6つの演算子
Solidityには主に6つの種類の演算子が存在しています。
- 算術演算子
- 関係演算子
- 論理演算子
- ビット演算子
- 代入演算子
- 条件演算子
算術演算子
算術演算子は、算術演算または数学演算を実行するために使用されます。
Solidity は、次の算術演算子をサポートしています。
算術演算子 | 記号 | 説明 |
---|---|---|
加算 | + | 2 つの要素の加算 |
減算 | – | 最初の要素から 2 番目の要素を減算 |
乗算 | * | 両方の要素を乗算 |
除算 | / | 分子を分母で除算 |
余り | % | 整数除算後の剰余を付与 |
インクリメント | ++ | 整数値を 1 増加 |
デクリメント | — | 整数値を 1 減少 |
下記はArithmeticSampleコントラクトの中でそれぞれの算術演算子の例を示したコントラクトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract ArithmeticSample { // 2つのpublicステート変数(状態変数)を定義 uint16 public a = 10; uint16 public b = 5; // 加算 uint public sum = a + b; // 減算 uint public diff = a - b; // 乗算 uint public mul = a * b; // 除算 uint public div = a / b; // 余り uint public mod = a % b; // インクリメント uint public inc = ++a; // デクリメント uint public dec = --b; } |
関係演算子
関係演算子は、2 つの値を比較するために使用します。
Solidityでは、次の関係演算子をサポートしています。
等価比較演算子 | 記号 | 説明 |
---|---|---|
同等 | == | 2つの値が等しいかどうかを調べ、等しい場合はtrueを、その逆の場合はfalseを返す |
等しくない | != | 2つの値が等しいかどうかを調べ、等しくない場合はtrueを返し、逆の場合はtrueを返す |
より大きい | > | 左の値が右の値より大きいかどうかを調べ、大きい場合は真を、逆の場合は偽を返します。 |
未満 | < | 左の値が右の値より小さいかどうかを調べ、小さい場合は真を、逆の場合は偽を返す |
以上 | >= | 左の値が右の値より大きくかつ等しいかどうかを調べ、大きくかつ等しい場合は真を、逆の場合は偽を返します。 |
以下 | <= | 左の値が右の値より小さいかどうかを調べ、小さくて等しい場合は真を、その逆の場合は偽を返します。 |
下記はRelationalSampleコントラクトの中でそれぞれの関係演算子の例を示したコントラクトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; // Creating a contract contract RelationalSample { // 2つのpublicステート変数(状態変数)を定義 uint16 public a = 10; uint16 public b = 5; // aとbは等しいか? bool public eq = a == b; // aとbは等しくないか? bool public noteq = a != b; // aはbより大きいか? bool public gtr = a > b; // aはbより小さいか? bool public les = a < b; // aはb以上か? bool public gtreq = a >= b; // aはb以下か? bool public leseq = a <= b; } |
論理演算子
論理演算子は、2 つ以上の条件を組み合わせるために使用されます。
Solidityでは、次の論理演算子をサポートしています。
論理演算子 | 記号 | 説明 |
---|---|---|
論理積 | && | 両方の条件が真の場合はtrueを、一方または両方の条件が偽の場合はfalseを返す。 |
論理和 | || | 片方または両方の条件が真のときtrueを、両方が偽のときfalseを返す |
論理否定 | ! | 条件を満たさない場合はtrueを返し、それ以外の場合はfalseを返す |
下記はRelationalSampleコントラクトの中でそれぞれの関係演算子の例を示したコントラクトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; // Creating a contract contract logicalSample{ function Logic(bool a, bool b) public view returns(bool, bool, bool){ // 論理積 bool and = a&&b; // 論理和 bool or = a||b; // 論理否定 bool not = !a; return (and, or, not); } } |
上記のスマートコントラクトのaに1、bに何も設定せずにコードをCallした場合、下記の結果となります。
論理積:false 論理和:true 論理否定:false
ビット演算子
ビット演算子は、ビット単位で動作し、ビットレベルの演算を実行するために使用されます。Solidity は以下の演算子をサポートしています。
ビット演算子 | 記号 | 説明 |
---|---|---|
AND | & | 整数の各ビットに対してブール演算の AND 演算を行う |
OR | | | | 整数の各ビットに対して論理和演算を行う |
XOR | ^ | 整数引数の各ビットに対して論理排他的論理和演算を行う |
Not | 〜 | 整数引数の各ビットに対して、ブーリアンNOT演算を行う |
左シフト | << | 第1オペランドのすべてのビットを第2オペランドで指定された数だけ左に移動 |
右シフト | >> | 第1オペランドのすべてのビットを第2オペランドで指定された桁数だけ右方向に移動 |
下記はBitwiseSampleコントラクトの中でそれぞれの関係演算子の例を示したコントラクトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract BitwiseSample { // 2つのpublicステート変数(状態変数)を定義 uint16 public a = 10; uint16 public b = 5; // AND uint16 public and = a & b; // OR uint16 public or = a | b; // XOR uint16 public xor = a ^ b; // Not uint16 public not = ~a ; // 左シフト uint16 public leftshift = a << b; // 右シフト uint16 public rightshift = a >> b; } |
代入演算子
代入演算子は、変数に値を割り当てるためのものです。
左側のオペランドは変数で、右側のオペランドは値です。
Solidity は、次の代入演算子をサポートしています
代入演算子 | 記号 | 説明 |
---|---|---|
割り当て | = | 右辺の値を左辺のオペランドに単純に代入する |
追加 | += | 左辺のオペランドに右辺のオペランドを加算し、左辺のオペランドに値を代入する |
代入減算 | -= | 左辺のオペランドから右辺のオペランドを減算し、その値を左辺のオペランドに代入 |
乗算代入 | *= | 両オペランドを乗算し、左オペランドに値を代入 |
分割 | /= | 左辺のオペランドを右辺のオペランドで割り、その値を左辺のオペランドに代入 |
係数の割り当て | %= | 左辺のオペランドを右辺のオペランドで割り、その余りを左辺のオペランドに代入 |
下記はAssignSampleコントラクトの中でそれぞれの代入演算子の例を示したコントラクトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract AssignSample { // publicステート変数の宣言 uint16 public assignment = 100; uint public assignment_add = 100; uint public assign_sub = 100; uint public assign_mul = 100; uint public assign_div = 100; uint public assign_mod = 100; // 代入演算子の処理を行う function calucuration() public{ assignment_add += 10; assign_sub -= 20; assign_mul *= 10; assign_div /= 10; assign_mod %= 20; return ; } } |
条件演算子
条件演算子は、最初に式を評価してから、true または false に対応する戻り値の条件をチェックする演算子です。
1 2 3 4 5 6 7 8 9 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract ConditionSample{ function x(uint a, uint b) public pure returns(uint){ uint calcResult = (a > b? a-b : b-a); return calcResult; } } |
最後に
今回紹介したSolidityの仕様やコードをRemix IDEやHardhatで実際に実行やテストをして確認してみましょう。
実際に動かしたり、テストすることで理解が深まるかと思います。
hardhatのインストール手順
HardhatでスマートコントラクトのDeploy手順