40

次のコードは C/C++ で何をしますか?

if (blah(), 5) {
    //do something
}
4

8 に答える 8

66

コンマ演算子が適用され、値 5 を使用して条件の true/false が決定されます。

blah() を実行して何かを返します (おそらく)。その後、コンマ演算子が使用され、式の真/偽の値を決定するために使用されるのは 5 だけです。


, 演算子は blah() 関数 (指定されていない) の戻り値の型に対してオーバーロードされる可能性があり、結果がわかりにくくなる可能性があることに注意してください。

于 2008-09-29T16:35:20.763 に答える
45

コンマ演算子がオーバーロードされていない場合、コードは次のようになります。

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 に感謝)

于 2008-09-29T16:35:48.097 に答える
20

この種のコードが実行する必要があることの1つを知っています。それは、コーダーを起動する必要があるということです。このように書いている人の隣で働くのはかなり怖いです。

于 2008-09-29T17:19:47.133 に答える
13

病理学的なケースでは、コンマ演算子が何をするかによって異なります...

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

bool operator,(PlaceHolder, int) { return false; }

if (Blah(), 5)
{
    cout << "This will never run.";
}
于 2008-09-29T16:52:24.937 に答える
1

それはblah()に依存していると思います。

于 2008-09-29T16:35:43.307 に答える
1

より広い答えについて。コンマ演算子 (オーバーロードされていない) は、最初の部分を実行して 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))

于 2008-09-30T11:46:40.170 に答える
0

デバッグ目的で、このような構造を使用することがあります。blahの戻り値に関係なく、if closeを強制的にtrueにすると。生産コードに決して現れてはならないことは明らかです。

于 2008-10-01T13:40:32.417 に答える
0

以下は、C ファイルまたは C++ ファイルの C ブロック内のいずれかの C コードであると想定して記述されています。

なら無意味です。blah() を呼び出しますが、blah() の結果はifによってまったく考慮されません。考慮されるのは 5 だけなので、if は常に true と評価されます。IOW このコードを次のように書くことができます

blah();
// do something

まったくなし

于 2008-09-29T16:38:14.003 に答える