• ベストアンサー

#defineについて、教えて下さい。

Cの、プログラムを勉強中なのですが、 #define SSS(x,y) ((x) > (y) ? (x) : (y)) は、どういう意味なのでしょうか? 教えて下さい。よろしくお願いします。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

> #define SSS(x,y) ((x) > (y) ? (x) : (y)) これは#define を使ったマクロ関数です。 ソースコード中で SSS(x,y) と書いたものが、プリプロセッサによって ((x) > (y) ? (x) : (y)) と書いたものに置き換わります。使うときは#define でx,yと書いてあっても、ソースコード中ではa,b などの変数を使用してかまいません。 マクロ関数の定義の中でわざわざx,yを()でくくるのは、演算子の優先順位の思い違いによる設計ミスを防ぐための習慣的な理由に基づくものです。 さてこのマクロ関数の動作です。 このマクロ関数は「xとyの大きさを比較して、xの方が大きければxを、そうでなければyを返す」という動作をします。 見慣れない表記かもしれませんが、「三項演算子」を用いています。三項演算子は a ? b : c という書き方をします。動作は、「aが真ならばbを、そうでなければ c をとる」です。if else で書ける内容を1行であらわしています。 三項演算子はソースコード中に書かれることはほとんどなく、今回の例のようにマクロ関数としてヘッダファイル内に記述されることが多いようです。

ccppmaster
質問者

お礼

ありがとうございます。m(_ _)m 三項演算子ですか。EXCELのIF関数のような動作になるんですね。(~o~) 助かりました。

その他の回答 (2)

noname#11722
noname#11722
回答No.3

#define自体は定数に名前をつける役目があります。 #define MAX_PATH 256 ならば、プログラム中にMAX_PATHという記述があれば、 コンパイルするときに256に置き換えられます。 #define SSS(x,y) ((x) > (y) ? (x) : (y)) ならば、SSS(x,y)の記述は((x) > (y) ? (x) : (y))に置き換えられます。 動作としては、 int a = SSS(5,8) と書いてあれば、 5と8を比較して-->(x)>(y)の部分 xが大きい(真ならば)-->(x):(y)の左の値を返す それ以外なら(偽ならば)-->(x):(y)の右の値を返す 上記であれば8が返ります。

ccppmaster
質問者

お礼

ありがとうございました。 皆さんの回答で、理解することが出来ました。 教えてgooの皆さんは、さすがです。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

『もし「SSS(cat,dog)」と書いてあったら「((cat) > (dog) ? (cat) : (dog))」と書き直して下さい』と言う意味です。 #define SSS(x,y) ((x) > (y) ? (x) : (y)) int cat; int dog; int max_val; cat = scanf("%d"); dog = scanf("%d"); max_val = ((cat) > (dog) ? (cat) : (dog)); /* 1 */ max_val = SSS(cat,dog); /* 2 */ 1と2は同じになります。 長い判定式や演算式を#define文で定義し、値が変わる部分を引数にしておけば、使い回しが出来ます。 max_val = SSS(cat,10); max_val = SSS(dog,10); max_val = SSS(dog,cat + 10);

ccppmaster
質問者

お礼

ありがとうございました。 使い回す為に、こんな書き方をするんですね。 参考になりました。ありがとうございます。 今回は、ポイントを差し上げられなくてすみません。

関連するQ&A