第11章  演算子


今回は、演算子(operator)について解説します。すでに、もう演算子は いくつか使っているのもあります。はやい話が、演算子とは「+−*/」 などの記号だと思ってください。ちなみに、「+−」はいいとして「*/」 は、かけ算とわり算の記号です。(そんなの常識だって?はい。すいません)

Cの演算子には、優先順位(precedece)とか結合規則(associativity)とかいう物があります。 これも、入門書の最初の方に書いてあると思います。 読んだだけでは、ピンとこないかもしれません。

優先順位は、だいたい常識的な考えでOK!心配ならカッコを使え!

そうです。四則演算の優先順位は、数学とほぼ同じです。 たとえば

100-25*2

という式があったら、まず25*2を先に計算するということは、 小学生でも知っています。Cでも同じです。 でもいろいろ複雑になってきた場合、心配なら先に計算する 所をカッコでくくってしまいましょう。この場合かっこは、 すべて()を使います。

100-(12*(3+5))

でもカッコが、4重にも5重にもなると 何がなんだかわからなくなる ので、せいぜい3重くらいにしておきましょう。

優先順位の表は、たいていの開発環境のHELP に載っています。あるいは、入門書に載っています。
この表は、VC++1.51のヘルプに載っている優先順位と 結合規則の表です。画面の都合上一部しか見えていませんが ずーーーっと下の方まで延々と続いています。

こんな物とっても覚えられない!

はい、その通りです。覚える必要もありません。 どうしても必要になる場合もありますが、 その機会は多くはないでしょう。 ちなみに、筆者はこの表を活用したことはありません。

すべてを網羅的に、解説していてはきりがないので ここでは、どうしても知っておかなくてはならない 物のみを解説します。さらに、詳しく知りたい人は 入門書などを見てください。

「=」と「==」

この違いは、重要です。イコール記号1個の場合は、 代入演算子(assignment operator)とよばれ、左辺に 右辺の定数を代入します。決して左辺と右辺が 等しいという意味ではありません。

a = 10;

とあれば、変数aに10を代入せよ、という意味です。 従って、次のようなこともできます。

a = a + 3;

すでに、aに代入されている物に3を加えて、aに代入せよ、 と読むことができます。(すでにaに値が代入されていなくては いけません。この意味わかりますか?)この意味が、よく わからない人のために、間違ったプログラムを書いてみます。 前回までで、一応一区切りついているので、プログラム名を 「EX02.EXE」にしてみました。(ま、どうでもいいことですが)

左のプログラムでは、まずint型の変数aを宣言しています。 この時点では、aの中身はなんだかわかりません。 それに対して、a=a+3;を実行しています。 これではいけませんね。こんな簡単な、プログラムでは 間違いがすぐにわかりますが、複雑になってくると 案外この手の間違いが起こることがあります。 しかし、最近の処理系では、コンパイルの段階で、 注意されるので、大丈夫かな。

今度は、aを宣言の時に初期化しているので、大丈夫です。 また、Cでは、a=a+3;などと書くより左のように、 a+=3;と書く方が一般的です。せっかくCで書くのですから Cらしい書き方の方が、いいですね。(a=a+3;では何だか BASICみたいに見えてしまいます。Cプログラマは、もっと 誇りを持ちましょう!)

実行すると、予定通りa=5となりましたね。めでたし、めでたし。

次に「==」ですが、こういうように演算子が2つくっついた物は 論理演算子(logical operator)であることが多い。要するに、 論理計算の時に使う。論理計算とは、何かというと集合の時 習ったandとかorと思えばよい。(わかりやすいが、乱暴な説明) 「==」は、等価演算子(equality operator)といって「右辺と左辺が 等しいかどうか」と読めばよい。

a == 5

とあれば、もしaに5が代入されていたら、この式の値は1(真)、 そうでなければ0(偽)となります。超初心者の方には、結構理解 しずらいところです。試しに、次のようなプログラムを書いて、 実験してみましょう。

aには、2が代入されています。 従って、(a==3)は、偽なのでこの式の値は0のはずです。 これを、bに代入しています。従ってbは0。
(a==2)は正しいので、この式の値は1です。それをcに 代入しているので、cは1。本当にそのようになっているか、 ビルドして実行してみましょう。

予想通り、b=0,c=1となりましたね。

次に、「!」ですが、これは否定演算子とか非等価演算子 (unequality operator)などと呼ばれている物です。 はやい話、打ち消しです。真を偽に、偽を真にする、と 覚えておけば間違いないでしょう。この演算子もすでに 第9章で使っていますね。 上のプログラムで、b=!(a==3);などとして 自分で実験してみてください。それとこれは、次のような 使い方がよくなされます。マイクロソフトのCの解説書 によく出てくる使い方です。

if(!func1()) func2();

func1を呼んで、もし失敗したらfunc2を実行しなさい。 ということです。func1は、成功したら真、失敗したら 偽を返すようになっているとします。func1が、成功したとき func2が、実行されては困るのでifの中に!をつけて真偽を 逆転させているのです。 この使い方は、重要です。 func2に、失敗したときの対策を書いておけばよいですね。 こういうように、プログラムには、必ず失敗対策をつけて おきましょう。( 大学受験と同じで必ず滑り止めをつけておく)

「++」「--」「||」「&&」もかなり重要です

「++」は、たとえばi++;とすれば、iの値を1増やします。 i+=1;と同じです。または、i=i+1;と同じです。 また、++iという書き方もあります。これは、iの値が先に1 増やされてしまいます。この2つの書き方の違いは、重要です。 論より証拠。プログラムを作って実験してみましょう。

i++と++jの違いは、是非この際覚えてください。

「--」も使い方は、「++」と同様です。

「||」は「または」、「&&」は「かつ」と読めば意味は通じる。 これも、すでに 第9章で使っています。(または、の方) 今回は、ずいぶんいろいろ書いたので筆者は疲れてしまいました。 まだ、「結合規則」について述べていません。これは、矢印が 右向きか、左向きかで表示されることが多いようです。 上の、表では言葉で書いてあります。 これは何かというと、同じ優先順位の演算子同士がある場合、 どの方向に向かって、計算(?)が進むかということです。 たいていは、左から右に進みます。迷ったら表を活用しましょう! (これじゃ解説になっていない。) 必要が生じたら、その都度説明することにして、今回はこれにて 閉講!


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Oct/26/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。