質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1488閲覧

競プロのrepマクロで、括弧が使われている理由

toshiyan

総合スコア74

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/01/27 05:24

編集2018/01/27 05:25

いつもお世話になっています。

cpp

1#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)

競プロで他の方のソースコードを参考にしていると、上記のようなrepマクロが定義されているのをよく見ます。
質問なのですが、なぜinを括弧で囲っているのでしょうか。以下の定義では駄目なのでしょうか。

cpp

1#define rep(i,n) for(int i=0;i<n;i++)

ご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

大昔に私が覚えたときも C 言語のマクロでは、仮引数はカッコで囲めと教えられました。
カッコの無いマクロ定義だと演算子の結合順位によって意図しない結合をしてしまうからです。

#define rep(i,n) for(int i=0;i<n;i++)

この定義に対して例えば、

C

1rep(i, x > 0 ? x : y)

みたいなことを書くとマクロの展開結果は

C

1for(int i=0;i< x > 0 ? x : y;i++)

となって、コンパイルエラーにはならないけど、結果はバグっているというえらいめんどくさいことになります。'<' や '>' は '?' ':' より結合度が強いので、マクロの '<' が先に結合してしまいます。カッコで囲まれていれば、

C

1for(int (i)=0;(i)< (x > 0 ? x : y);(i)++)

となるので大丈夫ですよね。
もちろん、マクロ内に出てくる演算子によってはそうならない(コンパイルエラーになる)ものもありますが、そんなことを考えるのが面倒なので習慣としてマクロ定義内の仮引数はすべてカッコで囲みましょうということになっています。

投稿2018/01/27 06:20

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshiyan

2018/01/27 07:03

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問