2016-08-24 2 views
-2

私はマクロがとても新しくなっています。
私は三項演算子を使って条件を使う方法を知っています。これらの条件がマクロ内にある場合、どのように書き込むのですか?

#define ifcount(i,j) ((i)==(j)? count=count+1\ 
            break:0) 

これは私が http://pastebin.com/i7Tuyh00

を変換しようとしているコードです:私はこれは私がこれで私の運を試してみたが、それは間違っているように思える #define

if(i==j) 
      { 
       count=count+1; 
       break; 
      } 

に変換するにはどうすればよい

+1

なぜあなたはそれを三元に変換する必要があると思いますか?マクロ内に 'if'を書くことができます。改行でバックスラッシュを忘れないでください。 –

+1

マクロを乱用しないでください。コードに改行を入れておけば、読んだ人には分かります。 – 2501

+0

@haccks 2行目です。条件が真でない場合には何も起こりません。 – Terminator

答えて

2

プログラムの流れを変更するためにマクロを使用するのは悪い考えです。コードを読んでいる人(数年後)がプログラムの流れで予期せぬジャンプによって驚くかもしれないからです。

しかし、あなたの問題は三項演算子とは関係ありません。実際には、三項演算子は右辺にブレークを含むことはできません。式のみです。このマクロの主な問題は、それを使用しているとき、人々は;を書きます、そしてそれは他の間で使用されている場合、それはひどく破壊されるということです

#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; } 

:あなただけ行うことができますので

しかしマクロは、allmightyあります括弧なしのif /elseペア:

if (...) 
    ifcount(a,b); 
else // <--- syntax error because the previous ; breaks the if /else relation 
    ...; 

標準溶液をdo/while(0)イディオムを使用することである。

#define do { ifcount(i,j) if ((i)==(j)) { count=count+1; break; } } while (0) 

しかし、これはbreakがあなたが望むものではなく、whileというこの内部を破るため、動作しません(@abelenkyへのクレジット)。

複合文を可能にし、;で終わるだけで、他のCの文は、このいずれかになります。

#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; } else 

問題ではなく、コンパイラエラーのため、あなたはifcount(i,j)を使用しているとき;を追加するのを忘れた場合ということですあなたは静かに編集し、驚くほど行動を変えるでしょう。

+0

大丈夫ですが、この先生は何ですかhttp://stackoverflow.com/questions/12989298/is-it-possible-to-use-a-if-statement-inside-define – Terminator

+0

@HumayunAkhtarあなたの流れを制御しようとしていますか? 'break'などのプログラム?または、式の結果を割り当てようとしていますか?あなたがリンクしているその質問は、何かを割り当てようとしています。あなたの質問はそれに関するものではありません。 –

+0

@AndrewHenleこれは私が変換しようとしているプログラムです。http://pastebin.com/i7Tuyh00 – Terminator

0

三元(?:)演算子を使用する必要はありません。
if文を使用しているマクロはここにあります。

#define IfCount(i,j) if ((i)==(j)) { count++; break; } 

用途:

IfCount(x,5); 

さて、皆さんはこれをどう思いますか?

#define IfCount(i,j) if ((i)==(j)) { count++; break; } do{}while(0) 

は、do-while-0単離された目的のいくつかを最終的役割を果たす:

  • そのマクロ使用はC「正常」のように見えると半で終わるように、セミコロンをハングアップする場所結腸。
  • 構文do{}while(0) elseが無効なので、後で誤ってelse文が出るのを防ぎます。

他には何がありますか?

+0

これはコンテキストで失敗します: 'if(...)IfCount(x、5); else ...ここにあるelseは構文エラーであるからです。だからこそ、人々は '#define IfCount(i、j)do {if((i)==(j)} {count ++;ブレーク; } while(0) 'meme; if(...)IfCount(i、j);の構文を破ることはありません。そうでなければ...。 –

+0

あなたのバージョンはどちらも動作しません: 'break'ステートメントは、外側のユーザー作成ループではなく、' do-while(0) 'ループから抜け出します。 – abelenky

+1

ああ〜futz!あなたはもちろんそうです。 Grrr!マクロがやろうとしていることをしないでください。 –

関連する問題