2017-12-11 13 views
2

자바에있는 다음 코드 값에자바 사후 증가 및 사전 증가

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

결과 : a = 1 인 이유는 포스트이기 때문에

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

나는 이해가 안 돼요 또한 값 b와 같은 방식으로 반응해야합니다. 또한 b----b으로 변경하면 여전히 b 값에 ​​아무런 영향을 미치지 않습니다.

이 논리를 이해하는 가장 좋은 방법은 무엇입니까?

+0

[Java가 연결을 평가할 때 ( && ), exp1이 false 인 경우에는 exp2를 계산합니까?] (https://stackoverflow.com/questions/9445145/when-java) -evaluates-a-combine-boolean-exp1-boolean-exp2-does-it-ev) – Joe

+0

일반적으로 이러한 코드는 실제 프로그래밍에서 피해야하며 오버 슛입니다. 이해합니다. 여기 교육적 배경이 있습니다 –

+1

참고 사항 [Java short-circuit operators] (https://stackoverflow.com/a/8759917/8097737) – devpuh

답변

13

a++ > 0a++이 이전 값 a (0)을 반환하기 때문에 false를 반환합니다.

따라서 b-- < 0은 전혀 평가되지 않습니다. &&은 단락 회로 연산자입니다. 오른쪽 피연산자는 왼쪽 피연산자가 true 인 경우에만 평가됩니다.

--c < 0 연산자는 || 연산자의 첫 번째 피연산자가 false이므로 두 번째 피연산자를 평가해야합니다.

d을 평가 한 후에 a이 증가 되었기 때문에 a의 값은 1입니다. b--이 실행되지 않았기 때문에 b0으로 유지됩니다. --c이 실행 된 이후 c-1입니다. 그리고 d--c < 0true이므로 true입니다.

+0

시간 내 주셔서 감사합니다.이 개념을 이해하는 데 도움이되었습니다. –

0

a++>0이 아니므로 b 부분은 평가되지 않고 증가하지 않습니다.

결과를 변경할 수없는 경우 &&|| 표현의 두 번째 부분은 평가되지 않습니다. &&의 경우 먼저 false은 결과 false을 결정합니다. 식은 다음 실제로 실행 한 후 포스트 증가 연산자로 한 것 실행 후

유비 먼저 true||는 (그러나 여기)의 결과

+0

비교시'a' **는 ** 1이지만 비교는'a ++'가 아니라'a ++ '의 이전 ** 값을 반환합니다. ** 값 (증가 후). 물론 –

+0

. 내가 대답을 업데이 트 –

0

를 결정한다.

표현식을 평가하는 동안 표현식에 관한 한 a는 0이지만 논리 연산자의 첫 번째 부분 인 논리 AND는 false로 평가되고 b 후행 감소는 평가되지 않습니다.

논리의 두 번째 부분이 실행되고 pre-decrement가 실행되어 c가 -1로 감소하면 비교가 true로 평가되므로 d가 true가됩니다.

변수를 구분하고 디버거를 통해 다른 항목을 확장하면 어떤 일이 발생했는지보다 대화식으로 설명 할 수 있습니다.

0

++ 또는 b--를 쓸 때 'a'값과 'b'값을 전달하고 변수를 수정합니다.> 첫 번째 표현식이 false를 반환하고 단락 AND 연산자를 사용했다 -

그래서 표현은, (> 0 & & 0 < 0 0)을 평가하는 동안, 단순히 지금

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

입니다. 필요 없다면 의미는 오른편을 평가하지 않는다. & &의 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로 평가되면 평가가 중단됩니다.