-
14-12-2019 - |
質問
次のコードを考えてみましょう。
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