• ベストアンサー

二つの値を交換する関数形式マクロ

type型の二つの値を交換する関数形式マクロの定義について、 どなたか教えて頂けませんか?   change(type, a, b) たとえば、int型の変数a, bの値が10, 20である場合、 change(int, 10, 20)を呼び出した後は、a, bには20と10が 格納される、というものです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.2

よくあるマクロ #define change(type, a, b) { a ^= b; b ^= a; a^= b;} 参照渡しで同じ意味の関数作っちゃうと a == b のときダメ、とか type見てないじゃん、とか 浮動小数点で使えないじゃん、とか

参考URL:
http://ja.wikipedia.org/wiki/XOR%E4%BA%A4%E6%8F%9B%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

よくあるマクロは #define change(type a, b) do { type _ = a; a = b; b = _; } while (0) かな. 変数名がかぶったら知らん. あと, change(int, 10, 20) とかいう呼出をしてみたりこれを式文で使ったりするとこけるけどそれも知らん.

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

よくわかりませんが、こういうことでしょうか。 #include <stdio.h> #define change(type, a, b) { type t; t = a, a = b, b = t; } int main(void) { int a = 10, b = 20; change(int, a, b); printf("%d %d\n", a, b); return 0; }

関連するQ&A

  • 関数形式マクロ

    type型の二つの値を交換する関数形式マクロ swap(type,a,b)を定義せよ 例えばint型でx、yに5、10があたえられているとき、swap(int,x,y)を 呼び出した後は、x,yには10と5が格納されていなければならない。 ・・という問題で以下のようにswapを作ったのですがエラーがでます どこが問題か教えていただけないでしょうか? #include <stdio.h> #define swap(type,a,b) (m = a a = b b = m) int main(void) { int x = 1,y = 2,m; swap(int,x,y); printf("x=%d y=%d\n",x,y); return(0); }

  • C言語での関数形式マクロの使い方

    前の質問No.300834(関数形式マクロと空白の質問)と関連します。 関数形式マクロで、引数として入れるものは、変数でなくて型名でも構わないのでしょうか。 例えば、 #define mymul(t,x,y) ((t)(x)*(t)(y)) と定義すると、 mymul(int, 5.0, 3.5) と呼び出すと、 ((int)(5.0)*(int)(3.5)) に置き換える、 (intでキャストした 5.0 と、intでキャストした 3.5 をかける) というのは可能でしょうか。 あと、関数形式マクロの呼び出しは、実行部分でなくてもよいのでしょうか。関数頭部(関数の本体の前の部分)で呼び出せますか。 例えば #define ARGUMENT3(t1,v1,t2,v2,t3,v3) ¥ (t1 v1, t2 v2, t3 v3) #define a_func b_func ARGUMENT3 と定義しておいて、 関数を定義するときに、 int a_func(int,x, char*,cp, int**,ypp) { ・・・・ } こんなことをすると、 int b_func(int x, char *cp, int **ypp) { ・・・・ } に置き換わりますか? もし、ARGUMENT3の定義を、ARGUMENT3の後の括弧の中のカンマのつけ方を変えて、 #define ARGUMENT3(t1 v1,t2 v2,t3 v3) ¥ (t1 v1, t2 v2, t3 v3) とし、 int a_func(int x, char* cp, int** ypp) { ・・・・ } こうすると、先ほどのようなb_funcの関数頭部に変換することは出来ませんか? (関数形式マクロでこのような空白の入れ方をしてよいのでしょうか。)

  • 誤った関数に関する値渡しについて

    こんにちは、まずはソースを記述します。 #include<iostream> using namespace std; //誤ったswap関数の宣言 void swap(int x, int y); int main() { int num1 = 5; int num2 = 10; cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; cout << "変数num1とnum2の値を交換します。\n"; swap(num1, num2); cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; return 0; } //誤ったswap関数の定義 void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } >>関数内で仮引数xとyの値を交換する処理を行っていても、これは変数num1とnum2の値を「コピー」した5と10を交換しているにすぎません。 swap関数内で値を交換しても、呼び出し元の変数であるnum1とnum2に影響を与えることができません。 ・・の文章の中から質問ですが値渡しとはどういうことでしょうか? 参照渡しとはどう違うのでしょうか? ご教示お願いします。

  • 二つ以上の値を返す関数

    たとえば、a,bという値を関数に入れて、関数の中で変わったa,bを受け取るような方法はないでしょうか。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=138798 の int main(void) { int a=1, b=2; func(&a, &b); printf("%d, %d\n", a, b); return 0; } void func(int *x, int *y) { *x++; *y++; } を実行してみましたが、 「関数 'func' は定義されていません。int 型の値を返す外部関数と見なします。」 と出てきました。 助言をよろしくお願いします。

  • ユーザ定義関数とマクロ関数で動作が一致しない

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

  • Cのポインタについて(関数への値渡し)

    C言語のポインタに関する質問です。関数に引数を渡す方法として以下の誤ったswap関数でなぜだめなのかいまいち得心できません。わかりやすくかみくだいて説明していただけると有り難いです。 できましたら、トレースともうしますか、変数の値の動きを詳細に段階的にプログラムの流れに沿って追っていって、だからこうなんだよ、みたいな解説がいただけたら有り難いです。わがままいってすみません。 /* 誤ったswap関数の宣言 */ void swap(int x, int y); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(num1, num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* 誤ったswap関数の定義 */ void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ---------- /* swap関数の宣言 */ void swap(int *pX, int *pY); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(&num1, &num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* swap関数の定義 */ void swap(int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pY = tmp; }

  • マクロ内での変数定義

    C言語においてのマクロの仕様を教えてください。 (1)マクロ内でコメントは不可なのでしょうか? (2)マクロ内で変数定義は不可なのでしょうか?  マクロは実行された場所に展開されるだけの認識ですので、  マクロ内で変数宣言されている場合、関数の先頭でしかマクロが使えない? よろしくお願い致します。 ----以下作成コード---- #define TESTMACRO(result,a,b) \ do{ \ int tmpData = 5; \ if( a=0){ \ result = -1; \ continue; \ } \ if( b=0){ \ result = -1; \ continue; \ } \ result = a*b*100; \ }while(0) int main(){ int result = 0; /* 他の処理 */ TESTMACRO(result,a,b);  /* 結果resultのログ表示 */ }

  • C言語の関数形式マクロの定義・呼び出し時の空白の挿入

    C言語で関数形式マクロを定義するときに、どこに空白(スペース)を入れてもよいのか、教えてください。 関数形式マクロとは、引数付きマクロと言っている本もあるようで、例えば、 #define mymul(x,y) ((x)*(y)) こんなものです。 mymul(a,b)と書いてあったら、((a)*(b))に置き換えますという意図です。 ・#の前 ・#とdefineの間 ・mymulと(x,y)の間 ・(とxの間 ・xと,(カンマ)の間 ・,(カンマ)とyの間 ・yと)の間 ・マクロ定義本体(つまり右側)の 一番目の括弧と二番目の括弧の間 ・二番目の括弧とxの間  以下同様に・・・・・・・・・・・・・ 呼び出す場合も、c=mymul(a,b)と呼び出す場合に、 ・=とmymulの間 ・mymulと( の間 ・( と a の間 ・aと,(カンマ)の間  ・・・・・・ これらのどこに入れてよいのか、 よろしくお願いいたします。 全角で書いてあるところがあります。例としてあげた定義の実益については問わないことにしましょう。

  • Excel マクロAが動作した時にマクロBをクリア

    Excelのマクロで、 マクロAを動作した時に、マクロBで変数(cnt)に格納していた値を「0」にする方法を教えて下さい。 現在やっていることは、 テンプレートをマクロBを使って1回ないし複数回セルの下に続けてコピーし、データを入力、 マクロAを使って別シートにそのデータを転記して清書すると言う形にしています。 マクロBで実行回数をcntに格納し、次にコピーする位置をcntを使って出しています。 cntの定義は、「Static cnt As Integer」になっています。 この変数cntを、マクロAを実行した時に、0にしたいのですが、 どの様に記述するのか独学なのでうまくいきません。 ご教授下さいますようお願いいたします。

  • ”int *a,*b”というポインタ変数宣言した値でa=&bということ

    ”int *a,*b”というポインタ変数宣言した値でa=&bということはできる? ”int *a,*b”このような変数をグローバル宣言した場合、 a=&bというようなことはできるのでしょうか? ”int *a,*b” この宣言で、 aが10番地 bが20番地に定義されたと仮定しています。

専門家に質問してみよう