Go言語演算子

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

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

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

次に、各演算子の説明を詳しく見ていきましょう。


算術演算子

次の表は、Go言語のすべての算術演算子を示しています。A=10、B=20とします。

演算子説明例
+加算A + B は結果 30 を出力
-減算A - B は結果 -10 を出力
*乗算A * B は結果 200 を出力
/除算B / A は結果 2 を出力
%剰余B % A は結果 0 を出力
++インクリメントA++ は結果 11 を出力
--デクリメント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 )
}

上記の例の実行結果は次のとおりです。

第一行 - c 的值为 31
第二行 - c 的值为 11
第三行 - c 的值为 210
第四行 - c 的值为 2
第五行 - c 的值为 1
第六行 - a 的值为 22
第七行 - 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" )
   }
}

上記の例の実行結果は次のとおりです。

第一行 - a 不等于 b
第二行 - a 不小于 b
第三行 - a 大于 b
第四行 - a 小于等于 b
第五行 - b 大于等于 a

論理演算子

次の表は、Go言語のすべての論理演算子を示しています。A=True、B=Falseとします。

演算子説明例
&&論理 AND 演算子。両方のオペランドが True の場合、条件は True になり、それ以外の場合は False になります。(A && B) は False
||論理 OR 演算子。どちらかのオペランドが 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" )
   }
}

上記の例の実行結果は次のとおりです。

第二行 - 条件为 true
第三行 - 条件为 false
第四行 - 条件为 true

ビット演算子

ビット演算子は、整数のメモリ内の2進ビットに対して演算を行います。

次の表は、ビット演算子 &、|、^ の計算を示しています。

pqp & qp | qp ^ q
00000
01011
11110
10011

A = 60; B = 13 とします。2進数に変換すると次のようになります。

A = 0011 1100

B = 0000 1101

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

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

Go言語がサポートするビット演算子を次の表に示します。A=60、B=13とします。

演算子説明例
&ビット単位 AND 演算子 "&" は二項演算子です。その機能は、演算に参加する2つの数の対応する各ビットの AND を取ることです。(A & B) の結果は 12、2進数では 0000 1100
|ビット単位 OR 演算子 "|" は二項演算子です。その機能は、演算に参加する2つの数の対応する各ビットの OR を取ることです。(A | B) の結果は 61、2進数では 0011 1101
^ビット単位 XOR 演算子 "^" は二項演算子です。その機能は、演算に参加する2つの数の対応する各ビットの XOR を取ることであり、対応する2ビットが異なる場合、結果は1になります。(A ^ B) の結果は 49、2進数では 0011 0001
<<左シフト演算子 "<<" は二項演算子です。n桁左シフトすることは 2 の n 乗を掛けることです。"<<" の左側の演算数の各ビットを、"<<" の右側の数で指定された桁数だけ全て左へシフトし、上位ビットは捨てられ、下位ビットには0が入ります。A << 2 の結果は 240、2進数では 1111 0000
>>右シフト演算子 ">>" は二項演算子です。n桁右シフトすることは 2 の n 乗で割ることです。 その機能は、">>" の左側の演算数の各ビットを、">>" の右側の数で指定された桁数だけ全て右へシフトすることです。A >> 2 の結果は 15、2進数では 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 )
}

上記の例の実行結果は次のとおりです。

第一行 - c 的值为 12
第二行 - c 的值为 61
第三行 - c 的值为 49
第四行 - c 的值为 240
第五行 - 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
その他の拡張