質問

次のコードを考えてみましょう。

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 ステートメントで使用できる他の式はありますか?

私はカンマの使い方で混乱しており、この式の構文がどこで定義されているのか疑問に思っています (カンマの存在を知りませんでしたし、どこで調べればよいのかも知りませんでした)。最後の式に無限の量のコードを入力できますか。ある場合、制限や要件などは何ですか?

役に立ちましたか?

解決

コンマ演算子を使用すると、無関係の2つの式をグループ化できます。両方の式は常に評価され、結果は2番目の式の結果です。それを使用することはほとんど常に悪い考えです(コードの行を節約するためだけに読みやすくするため)。

他のヒント

return [expression];

expression :
   expression , expression
   literal
   etc...
.

コンマ演算子は複数の行で複数の式を分離します。RETURNステートメントのような代入ステートメントで使用されている場合(返される一時的な値の割り当て)、右端の値のみが割り当てられます。上記の式は左から右へ実行されます。例では、最終関数呼び出し値が返されます。

この手法を使用して、失敗時に正式な引数変数を消去します。障害があるところで特にCOMルーチン。例えば:

HRESULT func(..., IInterface **ppv)
{
...
If(!good)
  return (*ppv = 0), E_FAIL;
...
}
.

, は次のような演算子です + または << そのため、式が期待されるほぼどこでも自由に使用できます。例外は、関数呼び出しなど、カンマが異なる意味を持つと想定されるコンテキストです。このようなコンテキストでは、追加の括弧を追加してカンマを明確にする必要があります。

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() できるだけ少ない行数を使用しながら。もちろん、関数全体は、有効な入力を取得するまで繰り返し入力を要求する「賢い」方法にすぎません。IMO ここでは再帰よりもループの方が良いでしょう。

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

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

詳細については、次の URL で読むことができます。 MSDN

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top