計算の基礎


算術式

コンピュータは人間のように自由に言葉をしゃべったりはしません。もっともこれは20世紀末期の話ですが…
そのかわり、人間に比べコンピュータは計算が得意です
人間にやらせたら数分かかるような、難しく難解な計算も現代のコンピュータは一瞬で答えをはじき出します

もちろん、その計算もプログラムの賜物なのです
コンピュータは計算が得意なのだから、これをプログラミングで利用しない手はありません

計算のためには、まず式(expression)を作ります
ここで言う式とは、基本的に数学で使われる「式」と同じ意味です

式はオペランド(operand)と演算子(operator)で構成されているものです

オペランド 演算子 オペランド...

オペランドはやりましたね。では「演算子」とはなんでしょう

演算子はズバリ!「足す」や「引く」で使われる数学記号 + , - などのことです
しかし、注意してほしいのですがコンピュータでは主に÷記号と×記号を計算に使いません
除算(÷)には / 記号を
乗算(×)には * 記号を使います

C言語では以下のような算術演算子があります

演算子意味
+加算
-減算
*乗算
/除算
%剰余(余り)
=代入

= の代入演算子はこれまで変数に代入するのに使ってきましたね

プログラムの計算は、普段の数学と大きくちがうところがあります
それは、必ず右辺の式を左辺に渡すということです

変数名 = 式

式には数学同様の優先順位が認められます。もちろん括弧も計算の意図によって付けられます
以下のプログラムを参照してください
#include <stdio.h>

int main()
{
        int var = 10;
        int ans;

        ans = var + 5 * 5;

        printf("変数ans = %d" , ans);

        return 0;
}
この講座は数学講座ではないので、数式についてあまり詳しくは取り上げませんが
上のプログラムの場合は、数学にのっとって 5 * 5 を最初に計算します
結果は25ですね.それに10を加算するので最終的には 35 が出力されます

次に括弧を使って優先順位を変えてみましょう
#include <stdio.h>

int main()
{
        int var = 10;
        int ans;

        ans = (var + 5) * 5;

        printf("変数ans = %d" , ans);

        return 0;
}
こうすれば var + 5 を優先して計算します。15 * 5 で結果は75になりますね

さて、上のサンプルプログラムでは全ての式の評価が変数に代入されていました
ですが、式の評価先が必ずしも変数とは限らないのです
引数リストの中に式を組み込むことで、式の評価を引数に渡すことも可能です
ここで、プログラムの定番(?)である簡易計算機を作成してみましょう
#include <stdio.h>

int main()
{
        int ope1;
        int ope2;

        printf("与えられたふたつの数を加算します\n");
        printf("最初の数を入力してください\n");
        scanf("%d" , &ope1);

        printf("%d に加算する数を入力してください\n" , ope1);
        scanf("%d" , &ope2);

        printf("答えは\t%d\tです" , ope1 + ope2);

        return 0;
}
printf("答えは\t%d\tです" , ope1 + ope2); に注目してください
printf()関数の引数リストの中に式を指定しています
当然出力される数は式の評価結果、ope1とope2を加算した結果が出力されます


最後に、ちょっとお遊びですが、これまで変数などを出力した時
必ず変数に代入された時と同じフォーマットで出力していました
つまり、10進数の内容をもつ変数は%d、1文字格納している変数は%cというようにです

しかし、たとえば'A'という文字キャラクタを%dで出力したら一体なにが表示されるのでしょう
Aは10進数ではありません。ですがフォーマットの指定は%d、つまり10進数で表示しろということですね
それを実験するプログラムを作ってみました
#include <stdio.h>

int main()
{
        char str;
        int get_int;

        printf("文字コードの仕組を調べます。1文字入力してください\n");
        scanf("%c" , &str);

        printf("\n入力コード\t= %c\n" , str);
        printf("コードの10進数\t= %d\n" , str);
        printf("コードの16進数\t= %x\n" , str);

        printf("\nコードに加算したい定数を半角英数で入力してください\n");
        scanf("%d" , &get_int);

        printf("\n入力コード\t= %c\n" , str + get_int);
        printf("コードの10進数\t= %d\n" , str + get_int);
        printf("コードの16進数\t= %x\n" , str + get_int);

        return 0;
}
これまでの講座内容の知識で、十分作れるプログラムです
しかし、ちょっと長めですし、コードの仕組を知るためのプログラムなのでコピーして実行してみてもかまいません
半角英数文字 'A' に 1 を加算して出力するとなにが出てくるでしょうか…試してください


インクリメントとデクリメント演算子

プログラムを作成する過程でよく出てくるのですが
ある変数に現在の値+1現在の値-1という計算が必要になる時があります

このとき、通常ならば var = var + 1; と記述することを思いつくでしょう
BASIC系言語の習得者ならば、特にこの記述法になれているはずです
もちろんこれでも間違いではありませんが、C/C++系言語ではこのような表記はしません

C言語には、現在その変数が保有する値に「1加算する」「1減算する」専門の演算子が存在します
それがインクリメントとデクリメント演算子です

変数名++;

変数名--;

++ がインクリメント演算子です その変数が現在格納している値に1加算します

ということは-- がデクリメント演算子です
インクリメントとは逆で、その変数が現在格納している値を1減算します
#include <stdio.h>

int main()
{
        int var = 10;

        var++;
        printf("インクリメント後のvar = %d\n" , var);

        var--;
        printf("デクリメント後のvar = %d\n" , var);

        return 0;
}
インクリメントとデクリメント演算子は、制御文などを使い始めると多用することになります
特にオブジェクト指向系言語では多く共通する演算子なので、非常に大切です

インクリメントやデクリメント演算子には、実は2種類あります
上のプログラムは、このうち後置演算子というものを使っています
このほかに前置演算子というものも存在します
それぞれ、後置インクリメント(デクリメント)演算子というような呼び方をします

前置インクリメント(デクリメント)演算子は、変数の前に演算子を置きます
後置と何が違うかというと、計算の順番が違います

++変数名;

--変数名;

実は、後置演算子というのは変数を評価してから 1 加算します
これに対して、前置の場合は最初に 1 を加算してから変数を評価します
これは、複雑な多項式や演算順序が重要な場合は影響が出てきます
#include <stdio.h>

int main() {
	int var1 = 0 , var2 = 0;
	printf("後置インクリメント演算子 = %d\n" , var1++);
	printf("前置インクリメント演算子 = %d\n\n" , ++var2);
	printf("後置デクリメント演算子 = %d\n" , var1--);
	printf("前置デクリメント演算子 = %d\n\n" , --var2);

	printf("var1 = %d var2 = %d" , var1 , var2);
	return 0;
}
結果はこうなる

後置インクリメント演算子 = 0
前置インクリメント演算子 = 1

後置デクリメント演算子 = 1
前置デクリメント演算子 = 0

var1 = 0 var2 = 0

最後の変数の内容を見れば結果は同じであることがわかります
しかし、printf() 関数が表示する変数の値はそれぞれ異なっています
多くの人が予想した結果は前置演算子を使った printf() 関数の方でしょう

後置演算子の場合は、printf() 関数に現在の変数の値を渡してから
変数をインクリメントしているのです
そのため、最初のインクリメントは 0 の状態を渡してからインクリメントしています
つまり、printf() が表示した値は 0 だが、その後の var1 の値は 1 なのです
それは、後置デクリメントを使っている printf() から想定することができるでしょう

前置の場合は、インクリメント/デクリメントしてから値を返しているので
printf() 関数が受け取る値はすでに計算された後です

もし x = var++ というような計算をする場合はこれに注意する必要があります
x に渡される値は var の値であり、その後に var がインクリメントされるのです



前のページへ戻る次のページへ