6

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

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

私は、宣言を真/偽の意味で解釈する方法に興味があります。

  1. 宣言です
  2. ダブルです。

編集:それは6.3.2.1の推奨事項としてのC++プログラミング言語です。

Edit2:特に動的キャストを使用したポインターのtemplatetypedefs提案は、Bjarnes提案への洞察を与える可能性があります。

SteveJessopは私に次のように語っています。-条件は式ではなく、宣言でもあり得ます。使用される値は、評価される値です。

4

4 に答える 4

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. */
}

特に一般的なケースは、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. */
}

あなたの場合に起こっていることは、あなたが声明のdouble中で宣言しているということです。ifC ++は、ゼロ以外の値をとして自動的に解釈し、ゼロ以外の値をとして自動的に解釈trueしますfalse。このコードの意味は、「宣言dして等しい値に設定しfd()ます。ゼロ以外の場合は、ifステートメントを実行します」です。

とは言うものの、これは非常に悪い考えです。なぜなら、doublesは、ほとんどの場合、0になるのを妨げるあらゆる種類の丸め誤差の影響を受けるからです。このコードは、非常に適切に動作しない限り、ほぼ確実にifステートメントの本文を実行します。function

お役に立てれば!

于 2012-06-26T23:11:07.660 に答える
5

Stroustrupの例では、ifブロック内のコードが値をd次のように除算しています。

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

0による除算は未定義の動作であるため、この場合、除算する前にd値に対してテストすることは理にかなっています。0.0Stroustrupが述べている理由から、定義を条件に入れることはこれを行うための便利な方法です。

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

{
    double d = fd();
    // d in scope here...
}
于 2012-06-26T23:33:47.653 に答える
2

ステートメントはif、代入式で変数に割り当てられた値を前提としています。doubleが0.0以外の値に評価された場合、内部でコードが実行されます。

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

基本的に、これを行うべきではありません。

このトピックの他の寄稿者は、この式がゼロ除算を回避するためにゼロの場合を除外するために使用されることを発見しました。それは間違いなく賢明であり、そのような状況は、私に関する限り、この使用法を正当化します(ただし、そのようなコードが引き起こす可能性のある混乱を考慮してください)。

于 2012-06-26T23:08:44.957 に答える
2

それは宣言とダブルの両方です。これは、

{
    double d = fd();
    if (d) {
    }
}

ただし、このパターンは非常に便利で一般的であるため、単純化するための小さな追加構文の価値があります。さらに、else句を追加し始めるとd、それらの範囲外であるため、変換はあまり明白ではありません。

また、他の人が指摘しているように、一般的には便利ですが、特にFPタイプには、0と比較するといくつかの問題があります。

于 2012-06-26T23:11:16.547 に答える