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

なぜか同じ内容であるはずのユーザ定義関数とマクロ関数で動作が
異なってくるのですがそんなことはあり得るのでしょうか?
ちなみにマクロ関数の方でうまくいきユーザー定義関数だとうまくいきません。
マクロ関数の方は以下のようなものです。
int iw;
#define iswap(a,b) {iw=a;a=b;b=iw;}
ユーザ定義関数の方は
int iw;
void iswap(a,b){
iw=a;a=b;b=iw
}
です。これらのものは違う動作をするものなのでしょうか?
プログラム自体は完成しているのですがどうしても納得がいきません。
回答・アドバイスよろしくお願いします。

A 回答 (4件)

残念ながら、このマクロと関数は同じ動作はしません(というか、同じ作用はしません)



まず、Cの引数は、「値渡し」です。基本的に、引数経由で値を受け取ることはできません。
引数経由で値を受け取るためには、ポインタを使って、変数の所在地を渡す必要があります。

マクロの方は、このまま展開されます。
iswap(x, y); は、同じ場所に、
{iw = y; x = y; y = iw;};
と書いたのと同じです。
つまり、こちらの引数(に指定した変数)は、値を書き換えられます。
    • good
    • 0
この回答へのお礼

自分が不思議でなりません。
完全に勘違いしてました。
ありがとうございました。

お礼日時:2006/11/30 23:29

全く違います。


マクロは展開されますが、関数は呼び出しです。

特に注意したいのが、
>#define iswap(a,b) {iw=a;a=b;b=iw;}
は、
  iswap(array1[i++], array2[j++]);
の様に使うと期待と違う動きをするということです。
  iw = array1[i++];
  array1[i++] = array2[j++];
  array2[j++] = iw;
このようになります。
インクリメントが増えていますよね。

このように、関数と同じ感覚で使ってしまうとおかしな動きをしますので、認識を改めますようお願いいたします。
    • good
    • 0
この回答へのお礼

大ボケをかましてしまいました。すみませんでした。

お礼日時:2006/11/30 23:26

Cの場合 関数への引数は値渡しになります


したがって void iswap( int a, int b) と宣言した場合
関数内で aやbの内容を変更しても 関数の呼び出し元に戻った場合の
変数などは影響を受けません

関数内の変更を反映させたい場合は引数を int* a, int* b といったポインタ変数にして参照渡しにしましょう

ポインタで渡した場合
void iswap( int*a, int *b )
{
// aの指すアドレスの内容を参照するには *演算子を使います
iw = *a;
*a = *b;
*b = iw;
}

呼び出し元では
int nA, nB;
nA = 30;
nB = 40;
// 変数を参照渡しにするには &演算子を使います
iswap( &nA, &nB );

また C++ならば int& a, int& b といった書き方でもいいですよ
void iswap(int& a, int&b )
{
iw = a;
a = b;
b = iw;
}
呼び出し元は
int nA, nB;
nA = 30;
nB = 40;
iswap( nA, nB );
といった具合でしょう ...
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。

お礼日時:2006/11/30 23:27

void iswap(a,b)


a と b の型は何になっていますか?
    • good
    • 0

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