6

Bjarneは、ifをスコープ制限として条件を使用することを提案しています。特にこの例です。true/falseをdoubleとする

if (double d = fd() ) { 
    // d in scope here... 
} 

私は、真偽の意味で宣言をどのように解釈するのかをよく知っています。

  1. それは、二重の宣言
  2. です。

編集: 6.3.2.1にあります。推奨されるC++プログラミング言語。

Edit2:templatetypedefs、特にダイナミックキャストを使用すると、Bjarnesの提案に洞察を与えることができます。

SteveJessopは次のように伝えています。条件が式ではないこともあります。使用される値は評価される値です。

+1

[この質問]に対する答えを(http://stackoverflow.com/q/9833790/636019)だけでなく、あなたの疑問にお答えします。 – ildjarn

+1

私はあなたが話しているセクションを読んだだけで、議論がスコープ制限として使うことについて(そしてコンパクトコードの付加的な利益を得ることについて)もっと議論されていたと感じていました。特定のデータ型。私は彼が 'ダブル 'を' int'に置き換えて、依然として彼の意図されたメッセージを渡すことができたと思う。それは私がそれをどのように読むかというだけのことだ。 – jedwards

+0

@jedwardsはい、しかし、二重の使用は答えを懇願しています。 int宣言は依然として答えに値する異常です。 –

答えて

6

表示されているコードは、ifステートメントで変数を宣言するための特殊なテクニックです。

if (T* ptr = function()) { 
    /* ptr is non-NULL, do something with it here */ 
} else { 
    /* ptr is NULL, and moreover is out of scope and can't be used here. */ 
} 

A特に一般的な場合は、ここでdynamic_castの使用である:あなたのケースで何が起こっている

if (Derived* dPtr = dynamic_cast<Derived*>(basePtr)) { 
    /* basePtr really points at a Derived, so use dPtr as a pointer to it. */ 
} else { 
    /* basePtr doesn't point at a Derived, but we can't use dPtr here anyway. */ 
} 

あなたはif文の中doubleを宣言していることであるあなたは、一般的にこのような何かを参照してください。 C++は、0以外の値を自動的にtrueと解釈し、ゼロ値はfalseと解釈します。このコードが意味することは、「dを宣言し、それをfd()と等しく設定します。0以外の場合は、if文を実行してください。

これは、非常に悪い考えです。doubleは、ほとんどの場合0にならないようなあらゆる丸め誤差の対象となるためです。 functionが非常に正常に動作していない限り、このコードはifの本文をほぼ確実に実行します。

希望すると便利です。

+0

@CaptainGiraffeあなたは答えとしてマークすることができます... – bames53

+0

@ bames53それはあなたが私の心を読んでいるかのようです。私はまだboolの不一致に関するコメントが好きです。b = double d = fd();しかし、それは別の質問かもしれません。 –

+1

"さらにスコープ外であり、ここでは使用できません" - これは 'else'節の* in *スコープですが、もちろんポインタとスマートポインタではテストする変数でできることはまったくありません偽ですので、通常はそこで使用されているとは見えません。別の値を割り当てることができました。あなたが "失敗"を示すための安全なブールイディオムを持つユーザ定義の型でそれを使用した場合、おそらく 'else'節であなたは*なぜ*失敗したのかを調べるでしょう。 –

2

if代入式の変数に割り当てられた値に関するステートメント述部。 doubleが0.0以外の何かに評価されると、コードが内部で実行されます。

ダブルスとゼロを比較することは想定されていませんが、一般的に私の経験では機能します。

基本的には、この操作は行わないでください。

このトピックの他の投稿者は、この式をゼロ除算を避けるためにゼロケースを除外するために使用することを発見しました。それは間違いなく賢明であり、このような状況は私が心配する限り(しかし、そのようなコードが引き起こすかもしれない混乱を考慮して)この使用法を合法化する。

+0

Bjarneは、これはイディオムだと私に伝えます。ただ言って。 6.3.2.1 C++プログラミング言語。 –

+2

彼は、ダブル 'd'が' if'ブロックのスコープ内*で(そして内部のみで)*であるという事実を指しているかもしれません。それは必ずしも明らかではない。私の主張は、ダブルをboolにキャストする正当な理由がないことが多いということです。なぜ、 'int'型の変数が使われていないのか分かりません。 (それは非常に一般的なイディオムです) –

+2

なぜ二重をゼロと比較していないのですか?それは完全にうまく動作し、明確な振る舞いをしています。浮動小数点数学は驚くかもしれませんが、それはブードーではなく、そのようなアドバイスによってうまく機能しません。 –

2

宣言と二重の両方です。これは非常に有用で一般的であるため、簡略化するために小さな付加的な構文の価値があります。さらに、dが範囲外であるため、else節の追加を開始すると変換があまり明確ではありません。

また、他の人が指摘しているように、それは一般的には有用だが、Stroustrup氏に与えた例では0

+0

これは私が満足している最初の答えです。この構文はどこにでもあります。 – jedwards

+0

私の質問にもbool b = double d = 0.0; –

+1

'd'が' else'ブランチのスコープから外れていますか? – jedwards

5

に対して比較したときに特定でFPタイプはいくつかの問題を持っているが、ifブロック内のコードはdによって値を除算します。 0によって

if (double d = prim(true)) { 
    left /= d; 
    break; 
} 

部門は、未定義の動作であるので、分割前の値0.0に対してdをテストする場合は、この場合である意味を行います。 Stroustrupが述べているように、定義を条件に入れることは、これを行う便利な方法です。

あなたのコードでは値0.0が特別な理由はありません。そのため、なぜ誰もがそのテストとdの定義を組み合わせる理由は明らかではありません。定義しているタイプの「偽」値が特別に扱われる必要がある場合にのみ、Stroustrupのパターンを使用してください。それ以外の場合はちょうどこの操作を行います。

{ 
    double d = fd(); 
    // d in scope here... 
} 
+0

私はちょうどそのセクションを読んで、接続をしませんでした - 私はそれが使い捨ての例だと思った - - 良いキャッチ。 'break;の洞察? – jedwards

+0

@jedwards:明白な部分を超えています(周囲のループやスイッチから壊れていますが、このコードの部分には表示されていません)。多分このコード断片は、章/本のどこかで使われているいくつかのコードから取られていますか?その点に関して、私は、関数 'prim'が何をするのか分からない。 –

+0

ああ、私は、[これらの宝石](http://www2.research.att.com/~bs/bs_faq.html)のように私に独り占めを加えるトリックだと思っていた。ありがとう! – jedwards

関連する問題