ここから本文です

#define swap(type,x,y) do{type t =x;x=y;y=t;}

fut********さん

2018/7/608:17:58

#define swap(type,x,y) do{type t =x;x=y;y=t;}

プログラミング初心者です
上の文でdefine を使う理由を教えてください
普通の関数だとダメなのは何故ですか?

閲覧数:
34
回答数:
3

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2018/7/609:15:36

『define を使う理由』

int 型でも float 型、double 型でも、何でも良いわけです。ポインタ型でもです。

type という引数がありますよね。そこです。C言語で出来ないので少々無理をしたということかと。

あと、& 演算子を書かなくても良い様にしたかったということも。


『普通の関数だとダメなのは何故ですか?』

void swap_int(int* x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
void swap_float(float* x, float *y)
{
float t = *x;
*x = *y;
*y = t;
}
void swap_double(double* x, double *y)
{
double t = *x;
*x = *y;
*y = t;
}

こうなるからです。しかも呼び出すときに、

int a = 1, b = 2;
swap_int(&a, &b);

float a = .1f, b = .2f;
swap_float(&a, &b);

double a = .1, b = .2;
swap_double(&a, &b);

こうだもの。やってられないでしょ。C 言語の悲しさ(?)が滲み出てる感じがします。



《参考》

C++ では次のようにすることができます。

template<class type>void swap(type& x, type& y)
{
type t = x;
x = std::move(y);
y = std::move(t);
}

  • 質問者

    fut********さん

    2018/7/812:40:59

    わかりやすかったので選ばせていただきます

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

kxk********さん

2018/7/609:00:41

関数でもダメではないですが、使う予定の type 別に複数の関数を用意する必要がありますね。

has********さん

2018/7/608:43:55

普通の関数だとだめだということはないですよ。
#defineは置換ですから、その箇所で置換されるわけです。
例えば
swap (int, a,b)
と書いてあるところが、
do{int t=a, a=b,b=t:}
と置換されて翻訳されるわけです。

関数にすると、関数呼び出しに必要な負担が増えますから、この程度ならこっちでもいいんじゃないんでしょうか?

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる