1

次の「WorldHello!」が印刷されるのはなぜですか?

私の理解では、演算子の優先順位に従って、これは右から左に評価する必要があります。しかし、代わりにそれは右から左から右のようです。どうしてこれなの?

#include <iostream>

using namespace std;


char print() {
    cout << "World";
    return '!';
}

int main() {
    cout << "Hello " << print() << endl;
    return 0;
}
4

4 に答える 4

6

オペレーターprint()の適用に関して、この規格が呼び出された正確な瞬間について保証するものではないと思います。<<

print()あなたの場合、最初に呼び出され、次にcout << Hello評価され、次に評価されるように見えます[result of the previous expression] << [result of print()]

于 2013-03-26T10:21:02.823 に答える
4

これは

operator<<
(
    operator<<
    (
        cout,
        "Hello"
    ),
    print()
)
.operator<<
(
    endl
);

引数の評価の順序は指定ていないため、2番目に内側の呼び出しで最も内側operator<<を評価する必要があることは言うまでもありません。print()operator<<

このように考えてください:foo( f1(), f2() );。どちらが最初に評価されますか、f1()それともf2()?わかりません。実行前に両方が完了することだけがわかっていfoo()ます。

左から右への優先順位は、私が書いた方法とペアになってしまうことを意味します。

ずっと後で編集:わずかな技術的エラー。通話endlは実際にはメンバーバージョンになります。ただし、他には何の違いもありません。

于 2013-03-26T10:22:41.297 に答える
2

これは右から左に評価する必要があります。

します。!一番最後から見ることができます。ただし、最終的な文字列は、演算子が評価されたcout 後に印刷されます。ただし、オペレーターの評価は、を印刷していWorldます。Hello!その後、が印刷されます。したがって、を取得しますWorldHello!

他の人が書いているように、それがあなたが得た結果であるとしても(そして私はそれを検証できたとしても)、評価の順序が指定されていないため、呼び出し順序に関して未定義の動作でさえあるかもしれません。

@Boは、C++標準を指す非常に優れたリンクを提供しました。

§5.2.2.8 - [...] The order of evaluation of function arguments is unspecified. [...]
于 2013-03-26T10:20:52.247 に答える
1

順序は未定義です。評価の順序を見てください。

cout << i << i++; // Undefined behavior
于 2013-03-26T10:20:16.463 に答える