見出し画像

(答案提出)C言語教室 第11回 - プリプロセッサとマクロ

なんだか、だんだん手に負えなくなってきた、、、。

課題

今回はコードを書くのではなく、說明をする文章題です。
課題
說明で使った MAX(x,y) というマクロで、引き数にインクリメント演算子を含んだ変数を書くと何が起こるか考察しなさい。
演習
プリプロセッサが自分の書いたコードを、どのように展開しているのかを確認する方法を調べなさい。

https://note.com/kazushinakamura/n/nb0b6ca29b15c

初めての文章題です。
うーん、、、わからん。

先ずは動かしてみましょう。


「說明で使った 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

となったのではないかと思います。


演習の答案

「プリプロセッサが自分の書いたコードを、どのように展開しているのかを確認する方法」は、実際にコーディングして検証すること。

、、、これで答案になってますかね?



ここまで読んでいただき、有難うございました。

いいなと思ったら応援しよう!

Akio van der Meer
これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。