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

No.2ベストアンサー
- 回答日時:
残念ながら、このマクロと関数は同じ動作はしません(というか、同じ作用はしません)
まず、Cの引数は、「値渡し」です。基本的に、引数経由で値を受け取ることはできません。
引数経由で値を受け取るためには、ポインタを使って、変数の所在地を渡す必要があります。
マクロの方は、このまま展開されます。
iswap(x, y); は、同じ場所に、
{iw = y; x = y; y = iw;};
と書いたのと同じです。
つまり、こちらの引数(に指定した変数)は、値を書き換えられます。
No.4
- 回答日時:
全く違います。
マクロは展開されますが、関数は呼び出しです。
特に注意したいのが、
>#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;
このようになります。
インクリメントが増えていますよね。
このように、関数と同じ感覚で使ってしまうとおかしな動きをしますので、認識を改めますようお願いいたします。
No.3
- 回答日時:
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 );
といった具合でしょう ...
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- 数学 f(x)=e^|-ax+b| (a>0、bは定数)のフーリエ変換 ax+b≧0 の時、 ∫(0~∞) 3 2023/02/10 20:01
- 数学 f(x)=e^|-ax+b| (a>0、bは定数)のフーリエ変換は、 (e^b+e^-b)/(iw- 4 2023/02/10 18:09
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Word(ワード) Word 2016のマクロを Word 2021のWordでキー動作させたい 3 2023/04/12 16:14
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Excel(エクセル) EXCEL値貼り付け(ある条件のもと自動化) 5 2023/06/06 12:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
関数の戻り値について
-
C言語エラーの解決法教えてくだ...
-
ハンドルされていない例外が発...
-
visualstudio C# テキストボッ...
-
512Lや1024L等の「L」について
-
C言語での方向キー入力判定
-
long型の定数の末尾にLを付ける...
-
sshdログの意味
-
マージソートのプログラム
-
関数の呼び出し
-
C言語 プログラミングについて
-
C言語ゲーム製作中 ソース公開
-
警告 ”値が割り当てられていな...
-
C言語初心者です。以下のような...
-
C++の分割コンパイルについて
-
VB6から参照可能なDLLの作成
-
コンパイルすると error C1083 ...
-
C++推奨のデータ型
-
ユーザ定義関数とマクロ関数で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報