式と計算

文字列は特殊なので別として、定数で扱ったような単純な値は、簡単に計算することができます。C言語による計算は、算数と同じ記号を使って行うことができます。例えば、加算であれば + 記号、減算であれば - 記号を使います。ただし、乗算は × ではなくアスタリスク *、除算は ÷ ではなくスラッシュ / を使うのがコンピュータの世界では一般的で、C言語も同様です。このような計算に使う記号を、演算子と呼び、計算する値を項と呼びます。

多くの演算子は、2つの項を計算する2項演算子に分類されます。この他に、項を1つしか受け取らない単項演算子、3つの項を受ける3項演算子なども存在しますが、この場では簡単で分かりやすい2項算術演算子についてご説明します。

加算演算子 + などは、演算子の前と後に項を指定します。他の算術演算子も、書き方は同じです。

10 + 100

上記は、有効なC 言語の式です。上記の式は、加算演算子 + と、左項の値10、右項の値100で構成されています。プログラムはこの式を実行すると、110という結果を返します。つまり、式 10 + 100 は、実行時に計算され110と評価されるのです。

ただし、上記の式はどこにでも書けるわけではありません。単純に10 + 100 と書いただけでは、その結果をどうすればよいのか分かりません。どこかに保存するか、渡さなければならないのです。この場では、式の結果をprintf()関数のパラメータとして渡し、表示する方法のみをご説明します。実は、関数のパラメータを渡す部分には式を記述することができます。

printf("%d\n", 10 + 100);

上記のprintf()関数の第2パラメータで、加算演算を行っている点に注目してください。関数が呼び出される前に、関数に渡すパラメータの式が先に実行されます。よって、このprintf()関数には10 + 100 の結果となる110が渡されることになるでしょう。

サンプル07

#include <stdio.h>

int main(void) {
    printf("1+2=%d\n", 1 + 2);
    printf("5-3=%d\n", 5 - 3);
    printf("10*5=%d\n", 10 * 5);
    printf("32/4=%d\n", 32 / 4);
    printf("13%5=%d\n", 13 % 5);
    return 0;
}

実行結果

1+2=3
5-3=2
10*5=50
32/4=8
13=3

サンプル07は、基本的な四則演算を行っています。printf()関数のパラメータが、単純な値ではなく演算子を使った式になっているところに注目してください。printf()関数を実行する前に、先にパラメータの式が計算され、その結果がprintf()関数に渡されていることが実行結果から確認できます。

演算子に指定する項は、値ではなく式そのものを指定することができます。よって、2項演算子の計算式を、他の演算子の項とすることで、複雑な多項式を表現することができます。

10 + 5 * 3

上記は、適切な計算式です。このように、2項演算子の式そのものを項とすることができます。演算子の優先順位は算数の法則が守られます。上記の式の場合、乗算演算が先に評価され、その結果が10に加えられます。よって結果は25となります。演算順序を変更したい場合は、括弧 ( ) で括ります。

(10 + 5) * 3

上記の結果は、先に ( ) で括られている加算演算が行われます。そのため、結果は45という値が得られるでしょう。

サンプル08

#include <stdio.h>

int main(void) {
    printf("1+2+3=%d\n", 1 + 2 + 3);
    printf("1+2*3=%d\n", 1 + 2 * 3);
    printf("(1+2)*3=%d\n", (1 + 2) * 3);
    return 0;
}

実行結果

1+2+3=6
1+2*3=7
(1+2)*3=9

サンプル08は、複数の演算子を組み合わせたより複雑な計算を行い、その結果をprintf()関数で表示するプログラムです。

また、整数型と浮動小数点数型の値を組み合わせて計算することも可能です。型が異なる値を計算する場合、自動的により大きな型に自動的に変換されます。整数型と浮動小数点数型の場合は、整数が浮動小数点数型に変換されて計算されます。

1 + 2.5

上記の式の結果は3.5となります。

本稿では算術演算子についてご説明しましたが、他にも2進数の値を直接操作する論理演算子やシフト演算子、値を比較する演算子などが存在します。計算はプログラミングの基礎的な要素なので、ドキュメントなどを調べて、どのような演算子が存在するのか、どのような効果があるのかを、実際にコードで書いて体験してください。最初は可能な限りシンプルなコードを書いて、納得がいくまで調べることが重要です。

最後に

今回は、原始的な値の表現と基礎的な計算方法についてご説明しました。繰り返しになりますが、プログラミング言語は仕様によって明確に文法が定められ、すべての表記に明確な意味が割り当てられています。単純な値ですらその対象であり、仕様で定められている表記方法を理解することは重要です。もちろん、最初は漠然とした書き方を理解していれば十分ですが、文法を細かく調べることで、何ができて何が出来ないのかを把握することができます。値や計算は非常に簡単なように思えますが、深く探究すれば多様な表現方法があることがわかります。