(答案提出)C言語教室 第11回 - プリプロセッサとマクロ
なんだか、だんだん手に負えなくなってきた、、、。
課題
初めての文章題です。
うーん、、、わからん。
先ずは動かしてみましょう。
「說明で使った MAX(x,y) というマクロ」というのは、
#define MAX(x,y) ((x) > (y) ? (x) : (y))
最近のマイブームの、3項演算子です(苦笑
「引き数にインクリメント演算子を含んだ変数を書く」
どゆこと?
たとえば、こういうこと?
printf("MAX処理中 i = %d, j = %d, max = %d\n", i, j, MAX(++i,j--));
動かしてみましょう
#include <stdio.h>
#include <string.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
void main()
{
int i = 3, j = 5;
printf("MAX処理前 i = %d, j = %d\n", i, j);
printf("MAX処理中 i = %d, j = %d, max = %d\n", i, j, MAX(++i,j--));
printf("MAX処理後 i = %d, j = %d\n", i, j);
}
実行結果
MAX処理前 i = 3, j = 5
MAX処理中 i = 4, j = 4, max = 5
MAX処理後 i = 4, j = 4
おやおや、なんか変ですね。
MAXが処理される行のなかで、既にiがインクリメントされ、jがデクリメントされています。MAXよりも前に、iとjを表示する様にコーディングしたので、
MAX処理中 i = 3, j = 5, max = 5
と、表示されるのを期待していたのですが、iとjの値が違っています。
課題の答案
プログラム中のそれぞれの式が評価される前に(表現あってますかね?)プリプロセッサが文字列の置換を行うのと同時に、そこで定義された式を評価し、その後に其の行が評価されるのではないでしょうか。
なので、上記式では++iとj--が評価されたのちにprintf関数が実行されたのではなかろうかと。
因みに、MAXがプリプロセッサでなく、関数であれば、
MAX処理中 i = 3, j = 5, max = 5
となったのではないかと思います。
演習の答案
「プリプロセッサが自分の書いたコードを、どのように展開しているのかを確認する方法」は、実際にコーディングして検証すること。
、、、これで答案になってますかね?
ここまで読んでいただき、有難うございました。
いいなと思ったら応援しよう!
これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。