9

このページの例を理解しようとして頭がしわになりました: http ://answers.yahoo.com/question/index?qid = 20099103170907AAxXYG9

より具体的には、このコード:

int j = 4;
cout << j++ << j << ++j << endl;

出力を与える:566

式が右から左に評価される場合、これは私には理にかなっていますが、Javaでは同様の式です。

int j = 4;
System.out.print("" + (j++) + (j) + (++j));

次の出力を提供します:456

これは、左から右に評価されていることを示しているため、より直感的です。さまざまなサイトでこれを調査すると、C ++ではコンパイラ間で動作が異なるようですが、私はまだ理解しているとは確信していません。JavaとC++の評価におけるこの違いの説明は何ですか?ありがとうSO。

4

3 に答える 3

11

操作に副作用がある場合、C ++は、副作用(増分、組み合わせた割り当てなど)をいつ有効にするかを決定するために、シーケンスポイントルールに依存します。論理and-then/ or-else&&および||)演算子、3つの?疑問符演算子、およびコンマは、シーケンスポイントを作成します。+、、-など<<はしないでください。

対照的に、Javaは、さらなる評価に進む前に副作用を完了します。

シーケンスポイントがない状態で副作用のある式を複数回使用すると、結果の動作はC++では定義されません。論理的に意味のない結果を含め、どのような結果でも可能です。

于 2012-06-21T19:30:34.783 に答える
5

Javaは、演算子のオペランドが特定の評価順序、つまり左から右に評価されているように見えることを保証します。二項演算子の左側のオペランドは、右側のオペランドのいずれかの部分が評価される前に完全に評価されているように見えます。Javaは、演算子のすべてのオペランド(条件演算子、、、およびを除く)が、操作自体の一部が実行される前に完全に評価されているように見えることも保証&&||ます?:。詳細については、Java言語仕様§15.7を参照してください。

一方、C ++では、言語自体が部分式の評価の順序を保証しないため、式があいまいな場合に未定義の動作を回避できます。詳細については、シーケンスポイントを参照してください。

于 2012-06-21T19:33:22.823 に答える
3

C ++では、部分式の評価の順序は左から右でも右から左でもありません。未定義です。

于 2012-06-21T19:30:09.947 に答える