2017-12-11 18 views
2

次のコード:値ののJavaポストインクリメントとプレインクリメントJavaで

int a = 0, b = 0, c = 0; 
boolean d = (a++ > 0 && b-- < 0) || --c < 0; 

結果:

a = 1, b = 0, c = -1 and d = true 

それがポストなのでaは、= 1である理由私は理解していませんまた、値bと同じ方法で反応する必要があります。また、b----bに変更しても、bの値には影響しません。

このロジックを理解する最も良い方法は何ですか?

+0

Javaが結合を評価すると( && )、exp1がfalseの場合はexp2になりますか?](https://stackoverflow.com/questions/9445145/when-java) -evaluates-a-conjunction-boolean-exp1-boolean-exp2-does-it-ev) – Joe

+0

一般的に、このようなコードは実際のプログラミングでは避けなければなりません。私は理解しています、ここでは教育的な文脈です –

+1

も参照してください[Java short-circuits operators](https://stackoverflow.com/a/8759917/8097737) – devpuh

答えて

13

a++ > 0は、a++a(0)の前の値を返すため、falseを返します。

b-- < 0は、&&が短絡オペレータであるため、まったく評価されません。右オペランドは、左オペランドがtrueの場合にのみ評価されます。

--c < 0が評価されます。||演算子の最初のオペランドはfalseであるため、2番目のオペランドを評価する必要があります。

dの評価後、aがインクリメントされたため、aの値は1です。 b--が実行されていないので、b0のままです。 --cが実行されたので、c-1です。 d--c < 0trueであるのでtrueです。

+0

あなたのお時間をいただきありがとうございます。 –

0

a++は、>0であるため、bの部分は評価されず、インクリメントされません。

&&||の2番目の部分は、結果を変更できない場合は評価されません。 &&の場合、最初にfalseが結果falseを決定します。発現はポストインクリメントオペレータは、次に実行されたように、実際に1になり、次に実行された後

類推、最初true||(ただしここ)

+0

比較の際、 'a' **は** 1ですが、比較は' a ++ 'であり、' a'の前の**値(インクリメントの前)を返します。** current **値(増分後)。もちろん –

+0

。私は答えを更新する –

0

の結果を決定します。

式の評価中、aは式が関係する限り0ですが、aは他のコードでは1になります。したがって、論理ORの最初の部分、論理ANDはFalseと評価され、 bポストデクリメントは評価されません。

論理の2番目の部分が実行され、次に実行され、プリデクリメントが実行されてcを-1に減らすと、比較がtrueに評価され、したがってdが真になります。

変数を区切るために異なる句を展開し、デバッガを実行して、何が起こっているのかをよりインタラクティブに説明します。

0

++ OR b-を書くと、値 'a'と現在の値 'b'が渡され、変数が変更されます。

だからあなたの式は単純で、今

boolean d = (0 > 0 && 0 < 0) || -1 < 0; 

評価しながら、(> 0 0 & 0) - >最初の式はfalseを返します、あなたは、短絡AND演算子を使用していました。意味は、必要でない場合は右側を評価しない。 & &のLHSはfalseを返すので、b--は評価されません。

私たちは 'd'が真です。

式内のポストインクリメント - >現在の値を最初に割り当て、後で変更します。

式内のプリインクリメント - >最初に変更し、後で更新値を割り当てます。

はよりよく理解短絡事業者のために、このリンクを参照してください: Short-Circuit Explanation

+0

これは[短絡演算子 '&&'と '||'](https://stackoverflow.com/a/8759917/8097737)については説明していません。 – devpuh

+0

@devpuhが答えを編集しました。今行動を説明します。 –

-2

このコードを実行してください。..

int a = 0, b = 0, c = 0; 
System.out.println("b = " + --b); 
b=0; 
System.out.println("b = " + b--); 
System.out.println("a = " + a++); 
a=0; 
System.out.println("a = " + ++a); 
System.out.println("c = " + c--); 
c=0; 
System.out.println("c = " + --c); 
a=b=c=0; 
boolean d = (a++ > 0 && --b < 0) || --c < 0; 

System.out.println("d = " + d); 

を私はあなたが完全なロジックを理解すると思います。

+1

人が質問をするとき、それは理解していないということです、それは他の人に役立つようにこの答えの詳細な答えです(これはStackOverflowの目標です...) – F0XS

+0

これは[短絡演算子 '&&'と '||'](https://stackoverflow.com/a/8759917/8097737)があります。 – devpuh

0

a ++は効果的にa = a + 1を意味します。したがって、a(= 0)の既存の値が式の評価に使用され、後でaの値が増分されます。したがって、aは1になります。

なぜb = 0で、なぜ--bがb--と同じ効果を持つのかについては、& &のためにbの値は変更されません。 ++> 0が満たされないので、次の式b_< 0は評価されず、bの値は0のままである。& &は、式が偽と評価されると評価を停止し、||ステートメントがfalseと評価されると評価が停止されます。

関連する問題