Go言語演算子

演算子は、プログラムの実行中に数学または論理演算を実行する場合に使用されます。

Go言語の組み込み演算子は次のとおりです。

  • 算術演算子
  • 関係演算子
  • 論理演算子
  • ビット演算子
  • 代入演算子
  • その他の演算子

次には、各演算子を詳しい説明します。

算術演算子

次の表に、Go言語のすべての算術演算子を挙げます。 仮にAの値が10で、Bの値が20であるとします。

演算子説明実例
+加算A + B = 30
減算A – B = -10
*乗算A * B = 200
/除算B / A = 2
%剰余演算B % A = 0
++i+= 1と同義A++ = 11
i‐= 1と同義A– = 9

次の例では、各算術演算子の使い方を示します。

実例

package main

import "fmt"

func main() {

   var a int = 21
   var b int = 10
   var c int

  c = a + b
   fmt.Printf("1行目-cの値は %d\n", c )
   c = a - b
   fmt.Printf("2行目-cの値は %d\n", c )
   c = a * b
   fmt.Printf("3行目-cの値は %d\n", c )
   c = a / b
   fmt.Printf("4行目-cの値は %d\n", c )
   c = a % b
   fmt.Printf("5行目-cの値は %d\n", c )
   a++
   fmt.Printf("6行目- aの値は %d\n", a )
   a=21   // テストにやさしいため、aは21に再割り当てされます
   a--
   fmt.Printf("7行目- aの値は %d\n", a )
}

上記のコードを実行した結果は:

1行目-cの値は 31
2行目-cの値は 11
3行目-cの値は 210
4行目-cの値は 2
5行目-cの値は 1
6行目- aの値は 22
7行目- aの値は 20

比較演算子

次の表に、Go言語のすべての比較演算子を挙げます。 仮にAの値が10で、Bの値が20であるとします。

演算子説明実例
==2つの値が等しいかどうかを確認し、等しい場合はTrueを返し、等しくない場合はFalseを返します。(A == B) は False を返します
!=2つの値が等しくないかどうかを確認し、等しくない場合はTrueを返し、等しい場合はFalseを返します。(A != B) は True を返します
>左側の値が右側の値よりも大きいかどうかを確認し、大なりの場合はTrueを返し、そうでない場合はFalseを返します。(A > B) は Falseを返します
<左側の値が右側の値よりも小さいかどうかを確認し、小なりの場合はTrueを返し、そうでない場合はFalseを返します。(A < B) は True を返します
>=左側の値が右側の値以上であるかどうかを確認し、大なりイコールの場合はTrueを返し、そうでない場合はFalseを返します。(A >= B) は False を返します
<=左側の値が右側の値以下であるかどうかを確認し、小なりイコールの場合はTrueを返し、そうでない場合はFalseを返します。(A <= B) は True を返します

次の例では、比較演算子の使い方を示します。

実例

package main

import "fmt"

func main() {
   var a int = 21
   var b int = 10

  if( a == b ) {
      fmt.Printf("1行目の-aは b\nに等しい" )
   } else {
      fmt.Printf("1行目の-aは b\nに等しくない ")
   }
   if ( a < b ) {
      fmt.Printf("2行目の-aは小なり b\n" )
   } else {
      fmt.Printf("2行目の-aは小なり b\nではない" )
   } 
   
   if ( a > b ) {
      fmt.Printf("3行目の-aは大なり b\n" )
   } else {
      fmt.Printf("3行目の-aは大なり b\nではない" )
   }
   /* Lets change value of a and b */
   a = 5
   b = 20
   if ( a <= b ) {
      fmt.Printf("4行目の-aは小なりイコール b\n" )
   }
   if ( b >= a ) {
      fmt.Printf("5行目の-bは大なりイコール a\n" )
   }
}

上記のコードを実行した結果は:

1行目の-aは bに等しくない
2行目の-aは小なり bではない
3行目の-aは大なり b
4行目の-aは小なりイコール b
5行目の-bは大なりイコール a

論理演算子

次の表に、Go言語のすべての論理演算子を示します。 仮にAの値がTrueで、Bの値がFalseであると想定します。

演算子説明実例
&&論理AND演算子。 両方の値がTrueの場合、条件はTrueで、そうでない場合はFalseです。(A && B) は Falseを返します
||論理OR演算子。 両方の値の中で1つがTrueの場合、条件はTrueです。そうでない場合はFalseです。(A || B) は True を返します
!論理NOT演算子。 条件がTrueの場合、論理NOT条件はFalseです。そうでない場合はTrueです。!(A && B) は True を返します

次の例では、論理演算子の使い方を示します。

実例

package main

import "fmt"

func main() {
   var a bool = true
   var b bool = false

   if ( a && b ) {
      fmt.Printf("1行目-条件は true\nです" )
   }
   if ( a || b ) {
      fmt.Printf("2行目-条件は true\nです" )
   }
   /* aとbの値を変換します*/
   a = false
   b = true
   if ( a && b ) {
      fmt.Printf("3行目-条件は true\nです" )
   } else {
      fmt.Printf("3行目-条件は false\nです" )
   }
   if ( !(a && b) ) {
      fmt.Printf("4行目-条件は true\nです" )
   }
}

上記のコードを実行した結果は:

2行目-条件は trueです
3行目-条件は falseです
4行目-条件は trueです

ビット演算子

ビット演算子は、整数がメモリ内のバイナリビットを操作します。

次の表には、ビット演算子 &、 |、および^の演算を示します。

pqp & qp | qp ^ q
00000
01011
11110
10011

仮にA = 60; B = 13で;バイナリ数は次のように変換されます。

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

Go言語でサポートされているビット演算子を次の表に示します。仮に Aが60で、Bが13であるとします。

演算子説明実例
&ビット AND は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが 1 の場合に 1 にします。(A & B) の結果は 12で、バイナリは 0000 1100です
|ビット OR は演算子の左辺と右辺の同じ位置にあるビットを比較して、少なくともビットのどちらかが 1 の場合に 1 にします。(A | B)の結果は 61、 バイナリは 0011 1101です
^ビット XOR は演算子の左辺と右辺の同じ位置にあるビットを比較して、どちらか 1 つだけ 1 の場合に 1 にします。(A ^ B) の結果は 49、バイナリは 0011 0001です
<<左シフトは左辺の値を右辺の値だけ左へシフトします。A << 2 の結果は 240 、バイナリは 1111 0000です
>>右シフトは左辺の値を右辺の値だけ右へシフトします。A >> 2 の結果は 15 、バイナリは 0000 1111です

次の例では、ビット演算子の使い方を示します。

実例

package main

import "fmt"

func main() {

   var a uint = 60      /* 60 = 0011 1100 */  
   var b uint = 13      /* 13 = 0000 1101 */
   var c uint = 0          

 c = a & b       /* 12 = 0000 1100 */ 
   fmt.Printf("1行目-cの値は%d\n", c )

   c = a | b       /* 61 = 0011 1101 */
   fmt.Printf("2行目-cの値は %d\n", c )

   c = a ^ b       /* 49 = 0011 0001 */
   fmt.Printf("3行目-cの値は %d\n", c )

   c = a << 2     /* 240 = 1111 0000 */
   fmt.Printf("4行目-cの値は %d\n", c )

   c = a >> 2     /* 15 = 0000 1111 */
   fmt.Printf("5行目-cの値は %d\n", c )
}

上記のコードを実行した結果は:

1行目-cの値は 12
2行目-cの値は 61
3行目-cの値は 49
4行目-cの値は 240
5行目-cの値は 15

代入演算子

次の表に、Go言語のすべての代入演算子を示します。

演算子説明実例
= 演算子の左辺(左側)の変数に、演算子の右辺(右側)の値を与えますC = A + B は A + B の結果を C割り当てます
+=加算後に割り当てますC += A は C = C + Aに相当します
-=減算後に割り当てますC -= A は C = C – Aに相当します
*=乗算後に割り当てますC *= A は C = C * Aに相当します
/=除算後に割り当てますC /= A は C = C / Aに相当します
%=剰余演算後に割り当てますC %= A は C = C % Aに相当します
<<=左シフト後に割り当てますC <<= 2 は C = C << 2に相当します
>>=右シフト後に割り当てますC >>= 2 は C = C >> 2に相当します
&=ビットAND後に割り当てますC &= 2 は C = C & 2に相当します
^=ビットXOR後に割り当てますC ^= 2 は C = C ^ 2に相当します
|=ビットOR後に割り当てますC |= 2 は C = C | 2に相当します

次の例では、代入演算子の使い方を示します。

実例

package main

import "fmt"

func main() {
   var a int = 21
   var c int
 c =  a
   fmt.Printf("1行目 - =  演算子の実例、c の値は = %d\n", c )

   c +=  a
   fmt.Printf("2行目- += 演算子の実例、c の値は = %d\n", c )

   c -=  a
   fmt.Printf("3行目 - -= 演算子の実例、c の値は = %d\n", c )

   c *=  a
   fmt.Printf("4行目 - *= 演算子の実例、c の値は = %d\n", c )

   c /=  a
   fmt.Printf("5行目 - /= 演算子の実例、c の値は = %d\n", c )

  c  = 200; 

   c <<=  2
   fmt.Printf("6行目  - <<= 演算子の実例、c の値は = %d\n", c )

   c >>=  2
   fmt.Printf(" 7行目 - >>= 演算子の実例、c の値は = %d\n", c )

   c &=  2
   fmt.Printf("8行目 - &= 演算子の実例、c の値は = %d\n", c )

   c ^=  2
   fmt.Printf("9行目 - ^= 演算子の実例、c の値は = %d\n", c )

   c |=  2
   fmt.Printf("10行目 - |= 演算子の実例、c の値は= %d\n", c )

}

上記のコードを実行した結果は:

1行目 - =  演算子の実例、c の値は= 21
2行目 - +=  演算子の実例、c の値は = 42
3行目  - -=  演算子の実例、c の値は = 21
4行目  - *= 演算子の実例、c の値は = 441
5行目 - /=  演算子の実例、c の値は = 21
6行目  - <<=  演算子の実例、c の値は = 800
7行目 - >>=  演算子の実例、c の値は = 200
8行目 - &=  演算子の実例、c の値は = 0
9行目 - ^= 演算子の実例、c の値は = 2
10行目 - |=  演算子の実例、c の値は = 2

その他の演算子

次の表に、Go言語にあるその他の演算子を示します。

演算子説明実例
&変数のストレージアドレスを返します&a; 変数の実際のアドレスが表示されます
*ポインター変数*a;はポインター変数です

次の例では、その他の演算子の使い方を示します。

実例

package main

import "fmt"

func main() {
   var a int = 4
   var b int32
   var c float32
   var ptr *int

   /* 演算子実例 */
   fmt.Printf("1行目 - a 変数の型は = %T\n", a );
   fmt.Printf("2行目 - b 変数の型は = %T\n", b );
   fmt.Printf("3行目 - c 変数の型は = %T\n", c );

   /*  &と * の演算子実例 */
   ptr = &a     /* 'ptr' が 'a' 変数のアドレスを含みます */
   fmt.Printf("a の値は  %d\n", a);
   fmt.Printf("*ptr は %d\n", *ptr);
}

上記のコードを実行した結果は:

1行目 - a 変数の型は = int
2行目 - b 変数の型は = int32
3行目 - c 変数の型は = float32
a の値は 4
*ptr は 4

演算子の優先順位

一部の演算子は優先順位が高く、二項演算子の操作方向は通常左から右です。 次の表に、すべての演算子とその優先順位を上から下に示します。

優先順位演算子
5/ % << >> & &^
4– | ^
3== != < <= > >=
2&&
1||

もちろん、括弧によって、式の全体的な優先度を一時的に上げることができます。

実例

package main

import "fmt"

func main() {
   var a int = 20
   var b int = 10
   var c int = 15
   var d int = 5
   var e int;

  e = (a + b) * c / d;      // ( 30 * 15 ) / 5
   fmt.Printf("(a + b) * c / d の値は : %d\n",  e );

   e = ((a + b) * c) / d;    // (30 * 15 ) / 5
   fmt.Printf("((a + b) * c) / d の値は  : %d\n" ,  e );

   e = (a + b) * (c / d);   // (30) * (15/5)
   fmt.Printf("(a + b) * (c / d) の値は  : %d\n",  e );

   e = a + (b * c) / d;     //  20 + (150/5)
   fmt.Printf("a + (b * c) / d の値は  : %d\n" ,  e );  
}

上記のコードを実行した結果は:

(a + b) * c / d の値は : 90
((a + b) * c) / d の値は  : 90
(a + b) * (c / d) の値は  : 90
a + (b * c) / d の値は  : 50
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です