3
int i=9;
System.out.println(--i + ++i);

実行時の出力:17
iの最終値は:9

しかし、javaの結合性と優先順位の規則によれば、++ iは最初に実行する必要があります。つまり、右から左に10を与え、次に--iは9を与えます。両方を追加すると、答えは19になります。私はそのようなコードがC/C ++で未定義の動作を与えることを知っていますが、Javaでは、ルールは厳密に定義されており、シーケンスポイントの概念はありません。だから、iamがこれについて本当に混乱しているので、誰かが問題を明確にすることができますか?また、いくつかの本では、ポストインクリメントおよびポストデクリメント演算子はLTR結合法則であると言及されていました。しかし、他のいくつかの本では、すべてのインクリメントとデクリメント(ポストとプレの両方)がRTLに関連付けられています.. !! 誰かがJavaの正しい演算子の優先順位と結合性の表を与えることができますか?

4

8 に答える 8

10

Java言語仕様のどこに右から左への結合性があると書かれているのか教えていただけますか? そうではなく、左から右です (複数の代入を除いて - などx = y = 4)。JLS セクション15.7.1を参照してください。「左側のオペランドを最初に評価する」というタイトルが付けられています。したがって、答えは正しいです:

--i + ++i

まず--i評価です。これはデクリメントi(現在は 8) し、デクリメント後の値 (8) を返します。次にこれが追加され、++iこれはインクリメント アンド ゲットと同等です (したがって、RHS は 9 に評価されます)。

に似ている

AtomicInteger i = new AtomicInteger(9);
i.decrementAndGet() + i.incrementAndGet();

これも評価されると思いますか?

于 2012-05-30T08:39:36.687 に答える
2

式の評価は左から右へ

(--i + ++i)

--i = 8 //i becames 8 here
++i = 9 // i becames 9 here again
8+9 = 17 
于 2012-05-30T08:40:17.517 に答える
1

最初に --i が 8 になり、次に ++i が 9 になります。したがって、答えは 17 です。

int i =9;

--i =8, now i is 8
++i=9 ,++ makes 9

so finally (8+9)=17 and i=9.
于 2012-05-30T08:39:24.130 に答える
0

出力は正しいです:

First,--iが先に実行されるので、theniが実行されます。さて、そうです私は になり、次に になる真ん中です。8++ii8++9+8 + 9 = 17

Java は、左から右への結合を行います。

于 2012-05-30T08:41:42.440 に答える
0

(--i + ++i)

評価は左から右に始まります。

first    (
second --i   // 8
third    +   // addition operator
fourth ++i   // 9
fifth    )

8 + 9 = 17
于 2012-05-30T08:45:44.627 に答える
0

int i=9; System.out.println(--i + ++i);

ご存知のように、インクリメントとデクリメントの優先順位は算術演算子 '+' よりも高いため、'++' と '--' が最初に評価されます。現在、単項演算子の結合性は右から左であるため、これによれば、「++」演算子を最初に評価する必要があります。しかし、評価の前に、バインディングの別の概念があるため、式を as としてバインドし、結合性 ((--i)+(++i))が左から右の () 演算子に従って、最初に評価(--i)し、次に(8+ (++i))andを評価しi=8ます。これで (++i) と が評価され(8+9)i=9最終的に答えは になります(8+9) = 17

于 2016-06-13T04:07:25.923 に答える