演算子
演算子は何らかの計算を行うための記号、あるいは記法です。
例えば次の式
1 + 1
における+
のことです。
一般的な演算子
一般的に演算子は次のようなお約束になっています。
意味 | 演算子 |
---|---|
加算 | + |
減算 | - |
乗算 | * |
除算 | / |
累乗 | ** , ^ |
(文字列)結合 | + , . |
等価比較 | == , eq |
大なり | > , gt |
小なり | < , lt |
以上 | >= , ge |
以下 | <= , le |
論理和 | || , or |
論理積 | && , and |
3項論理演算子 | <cond>?<iftrue>:<iffalse> |
累乗
累乗は多くの言語で**
が使われますが、累乗を表すときには^
を使用するほうが人気です。
現在一般的には^
はビット反転演算子に当てられています。
2 ** 6
で「2の6乗」、つまり64になります。
文字列結合演算子
たとえば
"abc" + "def"
というコードでabcdef
という値が得られます。
.
を使用する言語は少ないのですが、代表的にはPerlが使用が使用します。
文字列リテラル同士であれば連続する場合には結合する、という規則を持つものもあります。 例えばRubyでは
"abc""def"
でabcdef
という値を得られます。 これがリテラルではなく変数を使用する場合は+
で結合しなくてはいけません。
"def"
a = "abc" + a
シェルスクリプトでは常に文字列に展開されるため文字列結合を書く必要はなく、連続して記述すればそれだけで結合されます。
"abc"def
比較演算子
比較演算子はふたつの値を比較し、その真偽を判定します。
算数とはいささか違いがあり、
10 < 5
なんて書くこともできます。 この場合、10は5よりも 小さくない ため、偽になります。
真偽を判定するタイプの演算子の結果には次のようなパターンがあります。
true
またはfalse
を返す1
または0
を返す (そのまま真偽値として扱えることが多い)0
または-1
を返す- 偽ならエラーになる
以下を示す <=
と、以上を示す >=
はいささか覚えにくいかもしれません。 これは基本的な文字の中に≧のような記号がないためで、Fira CodeやIosevka, Monoidといった一部のフォントではそのような不等号で変形して表示されます。
なれないうちは「どちらにイコールがくるか」がなれないかもしれません。 プログラミングでは右矢印として->
や=>
は何かしらの意味で使われていることが多く、逆に左矢印を使うシーンはあまりない(代入に左矢印を使う言語も非常に稀)ため、右矢印として使える記号はとっておきたいのです。 そのため、=
を左に置いてしまうと大なりイコールが=>
と矢印になってしまうため、=
は右である、とお覚えておきましょう。
比較演算子は主には数値で使いますが、文字列でも使うことができることが一般的です。 文字列で使用する場合は通常「辞書順で先にくるほうが小さい」とみなされますが、単純に並べ替えるため以外で使うことはあまりありません。
Rubyなど一部の言語ではさらに異なるタイプの値でも比較することができます。 例えば配列やハッシュも比較することが可能です。
比較演算子にアルファベットのものを使うのは、Perl(数値比較の場合は記号、文字列の場合はアルファベット)とシェルスクリプトくらいのものです。
等号が=
ではなく==
であることに注意してください。 =
は一般に代入記号として使われます。
論理演算子
論理演算子の概要
論理演算子は値を論理値(真または偽)で評価した場合に、式全体が真または偽になるかを示すためのものです。
例えば「Aがうさぎで、かつBがうなぎだったら」という場合
A == "USAGI" && B == "UNAGI"
となります。
論理和、論理積、という言葉については、真を1(というよりも0以上)、偽を0として考えます。 和は足し算ですので、
0 + 0 == 0
1 + 0 == 1
0 + 1 == 1
1 + 1 == 2
ですから、偽(0)になるのは両方が偽(0)の場合だけです。
対して積は掛け算ですので
0 * 0 == 0
1 * 0 == 0
0 * 1 == 0
1 * 1 == 1
と今度は真(1)になるのは両方が真(1)の場合だけです。
このように考えるよりは単純に&&(and)
, ||(or)
と考えたほうが楽かもしれません。 文章にしてしまえばわかりやすいと思います。
短絡評価
論理演算子は「短絡評価」という方法を取るものが多くあります。
「AまたはB」であるとき、Aが既に成立する(1である)ならば、Bを確かめるまでもなく全体が成立ることが確定します。 このため、「右辺を評価しなくても結論が出ているならば、右辺は評価しない」という方法をとる、ということです。 https://www.marguerite.jp/Nihongo/WWW/Mobile/ForBothSmartPhoneAndFeaturePhone.htmlFH 単純な値であればあまり意味がありませんが、右辺が何かを実行するものであるとき、右辺は実行されません。 右辺が単に値を取得するものであればやはりあまり意味はありませんが、それ以外の動作(副作用)がある場合は実行制御としての意味があります。
次のPerlのプログラムは、open
関数によってファイルを開こうとし、これが成功すればopen
関数は真であるため右辺のdie
関数は実行されません。 ファイルを開くのに失敗するとdie
関数が実行され、プログラムはエラーメッセージを表示して終了します。
open(FH, "<$file") or die "Can't open file $file";
これは次のようなコードと同じ意味になります。
unless (open(FH, "<$file")) {
die "Can't open file $file";
}
短絡評価は様々なテクニックに使うことができ、コードが短く、読みやすくなる。 短絡評価を活用しなくてもコードは書くことができるため、無理に活用する必要はありません。
ただし、これによってコードが実行されない可能性がある、という点を忘れてはいけません。 例えば次のコード
@val = -5
def check_val(value)
@val = @val + value
return @val > 0
end
15) || check_val(20)) (check_val(
check_val
は@val
に対して引数の値を足し、その上で@val
が0
よりも大きなければ真を返します。 @val
の初期値は-5
で、論理演算子で15
と20
をそれぞれ引数として呼び出しますが、その結果は-5 + 15 + 20
の30
ではなく、-5 + 15
で10
になります。
これは、左辺のcheck_val
を呼び出した時点で15
を足して10
となっており、check_val
は真を返します。 そして左辺が真となったため、短絡評価が働き、右辺のchecl_val
はそもそも呼び出されることがありません。
3項演算子
3項演算子(?:
演算子)は条件式を書き、真の場合と偽の場合の式を書きます。
これはほとんどの場合簡単なif文として使われます。
$val > 10 ? "既に十分です" : "まだ追加できます";
この場合、$val
の値が10超ならば"既に十分です"
, 10以下なら"まだ追加できます"
という文字列を返します。 これは
if ($val > 10) {
"既に十分です";
else {
} "まだ追加できます";
}
と同じ意味です。