次のコードは C/C++ で何をしますか?
if (blah(), 5) {
//do something
}
コンマ演算子が適用され、値 5 を使用して条件の true/false が決定されます。
blah() を実行して何かを返します (おそらく)。その後、コンマ演算子が使用され、式の真/偽の値を決定するために使用されるのは 5 だけです。
, 演算子は blah() 関数 (指定されていない) の戻り値の型に対してオーバーロードされる可能性があり、結果がわかりにくくなる可能性があることに注意してください。
コンマ演算子がオーバーロードされていない場合、コードは次のようになります。
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()に依存していると思います。
より広い答えについて。コンマ演算子 (オーバーロードされていない) は、最初の部分を実行して 2 番目の部分を返すように解決されます。
したがって、 (foo(),bar()) がある場合、両方の関数が実行されますが、式の値は bar() (および式の型) に評価されます。
そのための公正な使用法があるとは言いませんが、通常、コードを読むのは少し難しいと考えられています。主な理由は、そのような構造を共有する言語は多くないためです。したがって、個人的な経験則として、既存の式にコードを追加し、その形式を完全に変更したくない場合を除き、私はそれを避けます。
例: 私はマクロを持っています (マクロを使用すべきかどうかについては議論していません。マクロを作成したのはあなたではない場合もあります)。
FIND_SOMETHING(X) (x>2) ? find_fruits(x) : find_houses(x)
そして、通常、 my_possession = FIND_SOMETHING(34); のような割り当てで使用します。
デバッグ目的でログを追加したいのですが、検索機能を変更できません。私はそれをできた :
FIND_SOMETHING(X) (x>2)? (LOG("果物を探しています"),find_fruits(x)):(LOG("家を探しています"),find_houses(x))
デバッグ目的で、このような構造を使用することがあります。blahの戻り値に関係なく、if closeを強制的にtrueにすると。生産コードに決して現れてはならないことは明らかです。
以下は、C ファイルまたは C++ ファイルの C ブロック内のいずれかの C コードであると想定して記述されています。
なら無意味です。blah() を呼び出しますが、blah() の結果はifによってまったく考慮されません。考慮されるのは 5 だけなので、if は常に true と評価されます。IOW このコードを次のように書くことができます
blah();
// do something
まったくなしで。