論理演算子

Go言語 (golang)

// 論理積(AND) (短絡評価あり)
x && y

// 論理和(OR) (短絡評価あり)
x || y

// 否定(NOT)
!x

オペランドはPythonやRubyなどと違ってbool型に限られる。

&&, || は左の項から順番に評価し、演算子の結果として truefalse のいずれかに決定した段階で評価をやめて true または false を返す (短絡評価、ショートサーキット評価)。

Java

// 論理積(AND) (短絡評価あり)
x && y

// 論理積(AND) (短絡評価なし/ビット演算子にもなる)
x & y

// 論理和(OR) (短絡評価あり)
x || y

// 論理和(OR) (短絡評価なし/ビット演算子にもなる)
x | y

// 排他的論理和(XOR) (短絡評価なし/ビット演算子にもなる)
x ^ y

// 否定(NOT)
!x

論理演算子の結果の値はPythonやRubyなどと違って常に true または false のいずれかになる。

&&, || は左の項から順番に評価し、演算子の結果として truefalse のいずれかに決定した段階で評価をやめて true または false を返す (短絡評価、ショートサーキット評価)。

&, |, ^ は短絡評価をせずすべての項が評価される。各項が論理値であれば論理積・論理和になるが、整数であればビット演算子になる。なお、ビット演算子の否定は ~x と書く。

Scala

Javaと同じ書き方ができるが、Javaと違って演算子ではなくすべてメソッドとして定義されている。

// 論理積(AND) (短絡評価あり)
x && y

// 論理積(AND) (短絡評価なし/ビット演算子にもなる)
x & y

// 論理和(OR) (短絡評価あり)
x || y

// 論理和(OR) (短絡評価なし/ビット演算子にもなる)
x | y

// 排他的論理和(XOR) (短絡評価なし/ビット演算子にもなる)
x ^ y

// 否定(NOT)
!x

論理演算子の結果の値はPythonやRubyなどと違ってJavaと同様に常に true または false のいずれかになる。

&&, || は左の項から順番に評価し、演算子の結果として truefalse のいずれかに決定した段階で評価をやめて true または false を返す (短絡評価、ショートサーキット評価)。

&, |, ^ は短絡評価をせずすべての項が評価される。各項が論理値であれば論理積・論理和になるが、整数であればビット演算子になる。なお、ビット演算子の否定は ~x と書く。

PHP

// 論理積
$x and $y
$x && $y

// 論理和
$x or $y
$x || $y

// 排他的論理和(XOR)
$x xor $y

// 否定
!$x

and, or, &&, || は短絡評価がある。

and&&or||演算子の優先順位)が異なるだけである。

論理演算子 | PHP Manual
http://www.php.net/manual/ja/language.operators.logical.php

Python

# 論理積
x and y

# 論理和
x or y

# 否定
not x

and, or は左の項から順番に評価し、演算子の結果として true か false のいずれかに決定した段階で評価をやめてその項の値を返す(短絡評価、ショートサーキット評価)。つまり、and は左から評価して、false の扱いになった項があればその時点で評価をやめて、その項の値を返し、すべて true の扱いであれば最後の項の値を返す。 or は左から評価して、true の扱いになった項があればその時点で評価をやめて、その項の値を返し、すべて false の扱いであれば最後の項の値を返す。最後に評価した項の値をそのまま返すため、式の値としては truefalse に限らない。

not は優先順位が低いので not x == ynot (x == y) の意味になる。

ブール演算子 | Python 2.7 documentation
http://docs.python.jp/2/reference/expressions.html#boolean-operation

ブール演算子 | Python 3 documentation
http://docs.python.jp/3/reference/expressions.html#boolean-operations

Ruby

論理演算子として、&&, ||, !, and, or, not がある。

!, not は否定で truefalse を返す。

&&, ||, and, or は左の項から順番に評価し、演算子の結果として true か false のいずれかに決定した段階で評価をやめてその項の値を返す(短絡評価、ショートサーキット評価)。その項の値をそのまま返すため、式全体が返す値は truefalse に限らない。 falseの扱いになるのは、false, nil のみである。 (-> 論理値への変換)

つまり、

and, or は関数の引数リストの区切りであるカンマよりも優先順位が低いため、関数呼び出しの引数リストの中にそのまま書くとコンパイルエラーになる。

a = nil
b = 10

p (a or b)
# => 10

p (a and b)
# => nil

p a or b
# => nil
# (p(a) or b) と解釈されているため

# 以下はカッコの中で引数リストを期待されている箇所にorがあるために
# コンパイルエラーになる。
# p(a or b)

Perl

# 論理積
x && y

# 論理和
x || y

# 否定
! x

論理積や論理和は最後に評価した項が演算子の結果になる。否定の演算子は結果が真であれば 1、偽であれば '' になる。

2 && 0   # => 0
2 && ''  # => ''
2 && 3   # => 3
0 && 2   # => 0
'' && 2  # => ''
3 && 2   # => 2
0 || 0   # => 0
'' || 0  # => ''

2 || 0   # => 2
2 || ''  # => 2
2 || 3   # => 2
0 || 2   # => 2
'' || 2  # => 2
3 || 2   # => 3
0 || 0   # => 0
0 || ''  # => ''

! 0      # => 1
! ''     # => 1
! 1      # => ''

sh (シェルスクリプト)

if文などでの論理演算子もどき。

# 論理積(AND)の例
if [ "$x1" -eq "$x2" -a "$y1" -eq "$y2" ]; then
    ...
fi
# または
if [ "$x1" -eq "$x2" ] && [ "$y1" -eq "$y2" ]; then
    ...
fi

# 論理和(OR)の例
if [ "$x1" -eq "$x2" -o "$y1" -eq "$y2" ]; then
    ...
fi
# または
if [ "$x1" -eq "$x2" ] || [ "$y1" -eq "$y2" ]; then
    ...
fi

# 否定(NOT)の例
if [ ! "$x1" -eq "$x2" ]; then
    ...
fi
# または
if ! [ "$x1" -eq "$x2" ]; then
    ...
fi

1つ目のコマンドに成功した場合に限って2つ目のコマンドを実行するには && で区切る。

COMMAND1 arg11 arg21 ... && COMMAND2 arg21 arg22 ...

1つ目のコマンドに失敗した場合に限って2つ目のコマンドを実行するには || で区切る。

COMMAND1 arg11 arg21 ... || COMMAND2 arg21 arg22 ...

これらは他のプログラミング言語での短絡評価の仕組みに似ている。

コマンドの実行に失敗したらシェルスクリプトを異常終了させるには

COMMAND1 arg11 arg21 ... || exit $?
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク