[前へ] [目次へ] [次へ]
式の解釈(1)(C/C++)
それでは実際にプログラムを作っていきますが、
その前に何を作るか決めなければいけません。
最初から複雑なものにしてもしょうがないですし、
ここはお約束的に「計算機」とします。
まず第一段階として、加算だけの計算機を作っていきます。
仕様としてはキーボードから二つの数値を入力して加算した結果を返すことにします。
また、小数点以下を処理すると面倒なので小数点以下は無視、上限値も9桁としておきます。
注:9桁というのは32bit変数が999999999まで表現できる限界桁数です。
さて、それでは仕様を決めたところで最も基本的な「式」について解説します。
計算機たるものユーザーからの入力によって計算しなければなりませんし、
それが出来なければプログラムとしても役に立ちません。
まず、一番簡単な式です。
int n;
n=10;
「 n=10 」の部分が式です。
C/C++言語は実は殆どが式なので、式でない部分の方が少ないです。
printf関数の呼び出しなども実は式です。
式は「演算子」と「オペランド」からなります。
「演算子」については「 演算子(C/C++) 」に示されているものです。
「オペランド」は演算の対象で定数や変数や関数など、
「型」が void 以外ならなんでも使用できます。
関数自体や関数の呼び出し、定数なども変数と同じように型があり、
これらを式のオペランドとして投入することが出来ます。
ただし、演算子は処理できる型が決まっていて、それに適合できない場合は、
「型が合わない」「〜を変換できない」などといったコンパイルエラーが出ます。
上記「 n=10 」の場合、
変数 n と 10 がオペランド、
= が演算子で「代入」(2項、算術、優先2、結合←)です。
この演算子は「右辺値」(演算子の右側のオペランド)を左辺値(演算子の左側のオペランド)に
コピーするもので、左辺値は変更可能な変数か、変更可能な変数への参照でなければなりません。
右辺値は左辺値と同じ型か、自動的に変換できる型か、
演算子関数が定義されている型(C++のみ)でなければなりません。
ただし、「 auto 」「 static 」「 const 」「 register 」「 volatile 」装飾は一致しなくてもOKです。
演算の終了後は、Cでは左辺値そのものになります。C++では普通「左辺値への参照」になります。(扱い的には同じです)
「変更可能な変数」とは一般的な変数のことで、
「変更できない変数」は宣言時に const を付けられているものです。
(宣言については「 変数の宣言と定義 」を参照)
「自動的に変換できる型」とは「暗黙の型キャスト」「暗黙の型変換」などと呼ばれる機能により、
左辺値と同じ型に自動的にキャスト(型の変換)が起こるためで、最終的には左辺値と同じ型である必要があります。
「暗黙の型変換」は代入時と演算時の2種類があります。
代入時に発生した場合は左辺値の型へ変換しようとします。
演算時の方は基本的には両方が基本型の場合で発生し、装飾などはそのままに以下の優先順位で
左辺値と右辺値の優先順位が高い方の型へ優先順位が低い方の値を変換しようとします。
低い← →高い
bool,char,short,int,long,float,double,long double
どちらの場合も普通変換対象にされた変数などの中身は変化しないため、
変更できない変数や定数(ソース中に直接書かれた数字等)などでも問題はありません。
さて、 n=10 は演算子がひとつなのでそれが処理されます。
後の解説のために、式中のそれぞれのオペランドと演算子に通し記号を打ちます。
n をA、 = をB、10をCとすることを、以下のように表現することにします。
A B C
n = 10
演算前の各要素は下記のようになります。
通し記号 | 型 | 値 | 種別 |
---|
A | int | 不定(未初期化) | 変数(n) |
B | | | 演算子(=)(2項、算術、優先2、結合←) |
C | const int | 10 | 定数 |
この場合、演算子B( = )は左辺値に変数A( n )、右辺値に定数C(10)をとり、
右辺値を左辺値にコピーします。その後、左辺値の参照
(C++の場合。C言語の場合も名前はないものの、同じもの)になります。
これが完了すると、式は以下のように変化したと考えることが出来ます。
A
n
各要素(といっても1つしかありませんが)は下記の通りです。
通し記号 | 型 | 値 | 種別 |
---|
A | int& | 10 | 一時変数(参照先:n) |
型の最後に & がくっつきましたが、これが「参照」の意味になります。
「参照」は「別名」のような機能で、本体(参照先)と完全に同一のものとして扱えます。
C言語の場合では対応する表現が存在しないため、 n そのものと思ってください。
どちらの場合も、結果は完全に同じになるので、CとC++の場合の違いはありません。
演算子が存在しなくなったので、式の処理は完了し、次の行へ進みます。
長くなったので今回はここで切ります。
次回は演算子が複数存在する場合について解説する予定です。
[前へ] [目次へ] [次へ]
プログラミング講座 総合目次
最終更新 2008/10/17