-6

今日、今まで見たことのない構文を見つけました。||,同じですか?

bool f() {

    cout << "f";
    return true;
}

bool g() {

    cout << "g";
    return true;
}

int main() {


    if(f(),g())
    {
        cout<<"OK with ,";
    }

    cout<<endl;

    if(f()||g())
    {

        cout<<"OK with ||";
    }

    return 0;
}

このプログラムの出力から、次のように見えます。

fgOK with ,
fOK with ||

それらはまったく同じものですか、それとも少し違いがありますか?

4

4 に答える 4

4

f(),g()f()評価してから評価g()して返すことを意味しg()ます。g()返されるのは、返さtrueれるものです。if

いいえ、オペレーターはまったく異なります。

falseから戻るように関数を変更すると、違いがわかりますg()。条件f()||g()は引き続き評価されますtruewhile f(),g()will return false.

于 2014-01-04T12:57:43.710 に答える
3

これ (コンマ演算子)

if(f(),g())

f()andの両方を評価しg()、第 2 オペランドの値を返します。g()

論理 OR 演算子

if(f()||g())

g()true と評価される場合は評価されませんf()。これは、短絡評価として知られています。f() が true を返す場合、論理 OR 条件は既に満たされているため、評価する意味はありませんg()

したがって、特定の条件下で全体的に同じ動作が見られる場合でも、それらはまったく同じではありません。

于 2014-01-04T12:59:54.093 に答える
2
  • || は論理 OR 演算子であり、標準では短絡評価に従います(つまり、最初のオペランドが論理式全体を決定するのに十分である場合、2 番目のオペランドは評価されません)。

  • 両方を評価するカンマ演算子ですが、2 番目のオペランドの値のみを返します。

ところで、次のようなものが表示されるはずです。

fgOK with ,
fOK with ||

表示されない理由は、標準に厳密に従っていないコンパイラを使用している可能性があります (MSVC と思われます)。

http://ideone.com/8dSFiY

于 2014-01-04T13:03:55.000 に答える
2

これらは、まったく異なる目的を果たすまったく異なるオペレーターです。

主な違いは次のとおりです。

  • 演算子 (オーバーロードされていない限り) は、すべての,引数を評価し、何があっても最後の引数を返します。
  • オペレーターは、最初のish 値||に到達するまですべての引数を評価し、残りは評価しません。true

これは、あなたが受け取ると主張している出力が間違っている理由でもあります。

于 2014-01-04T13:01:23.300 に答える