さて、C言語の命令も一通り説明出来ましたので、ここから先はトピックス的なものを書いていきます。
今回は「マクロ」について説明しましょう。
マクロとは、#defineで置き換えを行う事を指します。
要は「置き換え」なのですが、「#defineの罠」で説明していなかった事を書いていきます。
#defineの置き換えは、関数の引数のようなものを指定する書き方が出来ます。
まずは1つサンプルを作ってみましょう。
<sample program 184-01>
#include <stdio.h> #define PRINT(value) printf("%d\n", value) int main(void) { PRINT(5); return 0; } |
<実行結果>
5 続行するには何かキーを押してください・・・
#defineのところに PRINT(value) と書いてあります。
この括弧の中が「引数のようなもの」です。
関数の引数とは違って、やはり置き換えを行います。
main関数には、関数のように
PRINT(5) |
と書いてあります。
この5が value と置き換わります。
が、
printf("%d\n", value) |
に置き換わり、
value |
が
5 |
に置き換わるので、最終的には、
printf("%d\n", 5) |
に置き換わります。
次の例を書きましょう。
ビット演算などもマクロで置き換えることが出来ます。
ビット演算は、ぱっと見た時に何をしているか分かりにくい事があります。
32ビットの変数の下位16ビットを抜き出すマクロを作ってみます。
<sample program 184-02>
#include <stdio.h> #define LOW_BITS(bit) ((bit) & 0x0000FFFF) int main(void) { unsigned long data = 0x89ABCDEF; printf("LOW_BITS = %X\n", LOW_BITS(data)); return 0; } |
<実行結果>
LOW_BITS = CDEF 続行するには何かキーを押してください・・・
正直、副作用が怖いマクロですから bit に括弧を付けました。
bitも置き換えですから、式が置き換わった時に計算の優先順位で結果が変わる可能性があります。
最後に、今まで説明していなかった演算子を紹介します。
2つの「引数のようなもの」を使って、大きい方の数値を表示するプログラムを書きます。
<sample program 183-03>
#include <stdio.h> #define MAX(a, b) ((a) > (b) ? (a) : (b)) int main(void) { int value1 = 15; int value2 = 12; printf("MAX = %d\n", MAX(value1, value2)); return 0; } |
<実行結果>
MAX = 15 続行するには何かキーを押してください・・・
副作用防止のため括弧を付けまくったおかげで分かりにくくなってしまいました。
まずは、置き換えの結果を書いてみます。
MAX(a, b) |
は、
MAX(value1, value2) |
に置き換わります。
さらに、
((value1) > (value2) ? (value1) : value2) |
に置き換わります。
分かりにくいので括弧を外しましょう。
value1 > value2 ? value1 : value2 |
こうなりました。
初めて見る文法ですが、これは「三項演算子」と言います。
条件 ? 真の時 : 偽の時
条件が成り立っている時は、「真の時」に書かれている値が、成り立っていない時は「偽の時」に書かれている値が割り当てられます。
if文のショートバージョンと思ってください。
例えば、
int a = 5; int b = 3; printf("%d\n", a > b ? a : b); |
と書いた場合、結果は
5
と表示されます。
今回のプログラムでは、
value1 > value2 ? value1 : value2 |
こうなっていますから、変数の値を当てはめてみると、
15 > 12 ? 15 : 12
となります。
条件は成り立っていますから
15
が割り当てられ、
printf("MAX = %d\n", MAX(value1, value2)); |
は、
printf("MAX = %d\n", 15); |
になります。
頻繁に使うものではありませんが、テキストやサイトでプログラムを見た時に戸惑わないよう紹介しました。