0

次のコードを検討してください。

float validateEntry()
{
    string entry;
    float value;

    getline(cin, entry);
    value = atof(entry.data());

    return ((isNumber(entry) && value >= 0) ? i
    : (cout << "Enter valid amount: ", validateEntry())
}

最後の行 (カンマ区切りの式) が許可されているのはなぜですか? C++ の return ステートメントで使用できる他の式はありますか?

私はコンマの使用にほとんど混乱しており、この式の構文がどこで定義されているのか疑問に思っています (私はそれが存在することを知りませんでしたし、どこで見つければよいかも知りませんでした)。最後の式に無制限の量のコードを入力できますか? もしそうなら、制限、要件などは何ですか?

4

4 に答える 4

1
return [expression];

expression :
   expression , expression
   literal
   etc...

コンマ演算子は、複数の式を 1 行で区切ります。return ステートメント (返される一時的な値を割り当てる) のような代入ステートメントで使用すると、一番右の値のみが割り当てられます。前の式は左から右に実行されます。あなたの例では、最終的な関数呼び出しの戻り値が返されます。

この手法を使用して、失敗時に仮引数変数をクリアします。特に COM ルーチンでエラーが発生します。例えば:

HRESULT func(..., IInterface **ppv)
{
...
If(!good)
  return (*ppv = 0), E_FAIL;
...
}
于 2012-05-20T16:10:41.690 に答える
1

コンマ演算子を使用すると、関連のない 2 つの式をグループ化できます。両方の式が常に評価され、結果は 2 番目の式の結果になります。おそらく for ループの先頭を除いて、ほとんどの場合、これを使用するのは悪い考えです (コード行を節約するためだけに読みやすさが損なわれるため)。

于 2012-03-15T01:04:53.443 に答える
0

,+orと同じ演算子な<<ので、式が期待されるほとんどの場所で自由に使用できます。例外は、関数呼び出しなど、別の意味でカンマが必要なコンテキストです。このようなコンテキストでは、括弧のセットを追加してコンマを明確にする必要があります。

foo((b,c)); // call foo with a single argument

あなたが示すステートメントは、次のものと同等です:

// return ((isNumber(entry) && value >= 0) ? i : (cout << "Enter valid amount: ", validateEntry())

if(isNumber(entry) && value >= 0) {
    return i;
} else {
    cout << "Enter valid amount: ";
    return validateEntry();
}

これは、できるだけ少ない行を使用しながら、cout << "Enter valid amount: "呼び出す前に条件付きで実行する「賢い」方法です。validateEntry()もちろん、関数全体は、有効な入力が得られるまで繰り返し入力を要求する「巧妙な」方法にすぎません。ここでは、ループは再帰よりも優れています。

于 2012-03-15T01:15:26.367 に答える
0

? :C++ の唯一の三項演算子です。

その構文はlogical-or-expression ? expression : conditional-expression

詳細については、 MSDNを参照してください。

于 2012-03-15T04:38:10.647 に答える