どのようなカンマ演算子のか?
-
02-07-2019 - |
質問
どのような以下のコードをいC/C++?
if (blah(), 5) {
//do something
}
解決
カンマ演算子を適用すると、値に5を決定するために使用される条件のtrue/falseです。
で実行blah(まつもありがと思われるし、その後のカンマ演算子を用い5のことを決定するために使用されるtrue/falseの値表現です。
なお、オペレータが過負荷のために戻り値の型のティ()関数(ボートスキーリゾートなどが指定され、この結果が非自明である。
他のヒント
カンマ演算子がオーバーロードされていない場合、コードは次のようになります。
blah();
if (5) {
// do something
}
カンマ演算子がオーバーロードされている場合、結果はその関数に基づきます。
#include <iostream>
#include <string>
using namespace std;
string blah()
{
return "blah";
}
bool operator,(const string& key, const int& val) {
return false;
}
int main (int argc, char * const argv[]) {
if (blah(), 5) {
cout << "if block";
} else {
cout << "else block";
}
return 0;
}
(コンマ演算子のオーバーロードシナリオを表示するように編集。これについてコメントしてくれたDavid Pierreに感謝)
この種のコードがすべきことを1つ知っています。それは、コーダーを起動させる必要があるということです。このように書いている人の隣で仕事をするのは少し怖いです。
病理学的なケースでは、コンマ演算子の機能に依存します...
class PlaceHolder
{
};
PlaceHolder Blah() { return PlaceHolder(); }
bool operator,(PlaceHolder, int) { return false; }
if (Blah(), 5)
{
cout << "This will never run.";
}
私はそれがblah()に依存すると言うでしょう。
より広範な答え。コンマ演算子(オーバーロードされていない)はinとして解決し、最初の部分を実行して2番目の部分を返します。
したがって、(foo()、bar())がある場合、両方の関数が実行されますが、式の値はbar()(および式のタイプも)に評価されます。
そのための公正な使用法はありませんが、通常はコードを読むのが少し難しいと考えられています。主に、そのような構造を共有する言語は多くないためです。個人的な経験則として、既存の式にコードを追加し、その形式を完全に変更したくない場合を除いて、私はそれを避けます。
例:マクロがあります(マクロを使用する必要があるかどうかについては説明していませんが、マクロを作成したユーザーでもない場合があります)
FIND_SOMETHING(X)(x&gt; 2)? find_fruits(x):find_houses(x)
そして、通常my_possession = FIND_SOMETHING(34);のような割り当てで使用します。
今、デバッグのためにログを追加したいのですが、検索機能を変更できません。私はできる:
FIND_SOMETHING(X)(x&gt; 2)? (LOG(&quot;果物を探しています&quot;)、find_fruits(x)):( LOG(&quot;家を探しています&quot;)、find_houses(x))
デバッグの目的で、このような構成を時々使用します。ブラの戻り値に関係なくifをtrueに強制する場合。 実稼働コードに表示されるべきではないことは明らかです。
以下は、CファイルまたはC ++ファイルのCブロック内のCコードであると仮定して記述されています。
これは無意味な if です。 blah()を呼び出しますが、blah()の結果は if によってまったく考慮されません。考慮される唯一のものは5です。したがって、ifは常にtrueと評価されます。このコードは次のように書くことができます
blah();
// do something
if をまったく使用しない。