アプリ版:「スタンプのみでお礼する」機能のリリースについて


引数だけでどこでどう判断しているのですか?

#include <stdio.h>
#define dta(a,b) ((a)+(b))
#define pri(dt) printf("%d\n",dt)

int main(void)
{
   int cc;

   cc=dta(50,50);

   pri(cc);

return 0;
}

A 回答 (2件)

> 引数だけでどこでどう判断しているのですか?


申し訳ありません、意味がわからないので、このご質問には回答できかねます。

> 関数形式マクロ dtaは戻り値が書いてないのに戻ります
関数形式マクロはあくまでもマクロであって関数ではありません。
プリプロセッサによって定義された通りに変換されるだけです。

この場合は、
> #define dta(a,b) ((a)+(b))

によって

> cc=dta(50,50);

は、

cc=((50)+(50));

へ変換されるだけです。

> priは戻り値が書いてないので何も起こりません
これが関数だと仮定しても、「戻り値が書いてない」としても「何も起こりません」というのは理解できません。これはまるで戻り値がない、もしくは戻り値を使用しない関数は意味がない、もしくは何もしないように聞こえますが、そういうことが言いたいのでしょうか。もしそうなら、そのお考えはまったく間違っています。

件の、
> pri(cc);

は、

> #define pri(dt) printf("%d\n",dt)

の定義に従いプリプロセッサによって、

printf("%d\n",cc)

へ変換されます。

「戻り値が書いてない」、この文の意味がわかりませんが、返還後の printf 関数には戻り値があります。この関数の戻り値を使うことは稀ですが。
    • good
    • 0

純粋にコンパイラの立場から言えば (マクロはコンパイラが処理する前に展開されているので) 「判断」などということは一切しません. どういうことかというと, このプログラムをコンパイラに与えたとしても, 実際にコンパイラが見るのは (#include でインクルードされる <stdio.h> の分を無視すると)


int main(void)
{
   int cc;

   cc=((50)+(50));

   printf("%d\n", cc);

return 0;
}
だけです. ここから何をどう「判断」すればよいでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!