18

コードをいじり回すときに、このかなり漠然とした動作に出くわしました。例を次に示します。

#include <iostream>

using namespace std;


int print(void);

int main(void)
{
    cout << "The Lucky " << print() << endl;     //This line
    return 0;
}

int print(void)
{
    cout << "No : ";
    return 3;
}

私のコードでは、コメント付きのステートメント//This lineは出力されるはずです The Lucky No : 3が、代わりに出力されNo : The Lucky 3ました。この動作の原因は何ですか?これはC++標準と関係がありますか、それともその動作はコンパイラごとに異なりますか?

4

3 に答える 3

18

関数の引数の評価順序は指定されていません。コンパイラにとって、行は次のようになります。

operator<<(operator<<(operator<<(cout, "The Lucky "), print()), endl);

ステートメントの主な呼び出しは、引数としてendlを使用する呼び出しです。2番目の引数endlが最初に評価されるのか、それともより大きな部分式が評価されるのかは指定されていません。

operator<<(operator<<(cout, "The Lucky "), print())

そして、それを分解すると、関数print()が最初に呼び出されるのか、部分式が呼び出されるのかは指定されていません。

operator<<(cout, "The Lucky ")

だから、あなたの質問に答えるために:

この動作の原因は何ですか?これはC++標準と関係がありますか、それともその動作はコンパイラごとに異なりますか?

コンパイラによって異なる場合があります。

于 2012-07-22T21:01:42.660 に答える
4

operator <<単純にと呼びましょうoperator

今、私たちは書くことができます

cout << "The Lucky"

なので

operator(cout, "The Lucky")

この操作の結果はcoutであり、次のに渡されるので、次<<のように書くことができます。

operator(operator(cout, "The Lucky"), print() )

これは2つのパラメーターを使用した関数呼び出しであり、標準ではそれらの評価の順序については何も述べていません。

したがって、一部のコンパイラでは、実際に取得する可能性があります

The Lucky No : 3
于 2012-07-22T21:02:35.083 に答える
0

私のコンパイラではいいえ:ラッキー3は出力です....それはその動作がコンパイラごとに異なることを意味します。

于 2015-11-20T17:11:05.103 に答える