#8 演算子と関数

演算子

演算子は何らかの計算を行うための記号、あるいは記法です。

例えば次の式

における+のことです。

一般的な演算子

一般的に演算子は次のようなお約束になっています。

意味演算子
加算+
減算-
乗算*
除算/
累乗**, ^
(文字列)結合+, .
等価比較==, eq
大なり>, gt
小なり<, lt
以上>=, ge
以下<=, le
論理和||, or
論理積&&, and
3項論理演算子<cond>?<iftrue>:<iffalse>

累乗

累乗は多くの言語で**が使われますが、累乗を表すときには^を使用するほうが人気です。

現在一般的には^はビット反転演算子に当てられています。

2 ** 6 で「2の6乗」、つまり64になります。

文字列結合演算子

たとえば

"abc" + "def"

というコードでabcdefという値が得られます。

.を使用する言語は少ないのですが、代表的にはPerlが使用が使用します。

文字列リテラル同士であれば連続する場合には結合する、という規則を持つものもあります。 例えばRubyでは

abcdefという値を得られます。 これがリテラルではなく変数を使用する場合は+で結合しなくてはいけません。

シェルスクリプトでは常に文字列に展開されるため文字列結合を書く必要はなく、連続して記述すればそれだけで結合されます。

比較演算子

比較演算子はふたつの値を比較し、そのを判定します。

算数とはいささか違いがあり、

なんて書くこともできます。 この場合、10は5よりも 小さくない ため、になります。

を判定するタイプの演算子の結果には次のようなパターンがあります。

以下を示す <= と、以上を示す >=はいささか覚えにくいかもしれません。 これは基本的な文字の中に≧のような記号がないためで、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関数が実行され、プログラムはエラーメッセージを表示して終了します。

これは次のようなコードと同じ意味になります。

短絡評価は様々なテクニックに使うことができ、コードが短く、読みやすくなる。 短絡評価を活用しなくてもコードは書くことができるため、無理に活用する必要はありません。

ただし、これによってコードが実行されない可能性がある、という点を忘れてはいけません。 例えば次のコード

check_val@valに対して引数の値を足し、その上で@val0よりも大きなければを返します。 @valの初期値は-5で、論理演算子で1520をそれぞれ引数として呼び出しますが、その結果は-5 + 15 + 2030ではなく、-5 + 1510になります。

これは、左辺のcheck_valを呼び出した時点で15を足して10となっており、check_valを返します。 そして左辺がとなったため、短絡評価が働き、右辺のchecl_valはそもそも呼び出されることがありません。

3項演算子

3項演算子(?:演算子)は条件式を書き、の場合との場合の式を書きます。

これはほとんどの場合簡単なif文として使われます。

この場合、$valの値が10超ならば"既に十分です", 10以下なら"まだ追加できます"という文字列を返します。 これは

と同じ意味です。