2016-10-29 9 views
-2
int number; 
number = 80; 

number = (int)math.sqrt(number++) 
System.out.println(number) 

이 위의 코드이다. 나는 프로그래밍에 익숙하지 않은 상태에서 수학을 잘하고 있습니다. 대답은 내가 그러나 주어진 답에 영향을 미칠 수있는 ++의 VAR 및 VAR ++와 방법을 알고 9.누군가이 숫자를 설명 할 수 있습니까 = 80; number = (int) math.sqrt (number ++); number = 8?

없는 이유

가 나는 SQRT 내가 혼란 스러워요이 경우 그러나 8입니다 알고 플러스는 인쇄 코드 위에 있는데 왜 나는 8을 ​​더하지 않고 9를 인쇄하는지 혼란 스럽습니다. 식을 의미

+0

'8.944 ...'는'int'로 형 변환 될 때'8'이됩니다. 이것은'println()'을 사용한 실제 인쇄와는 아무런 관련이 없습니다. 이 값을 변수'number'에 저장하고 ** ** 그 값을 증가시킵니다. 증분은'number'에 저장되지 않습니다. – Gendarme

+0

안녕하세요, 조,이 개념을 이해하도록 도와 주셔서 감사합니다. Regaurds, joe – JAVAJoseph

답변

1

number++ postincrements는 제곱근 함수의 내부 (80)에 평가된다. 80

제곱근 때문에 ((int)으로 수행)는 정수 변환은 다음 우선 표현식을 평가할 제

+1

안녕하세요, 답장을 보내 주셔서 감사합니다. 감사합니다 조 – JAVAJoseph

1
number = (int)math.sqrt(number++) , 

, 그때 수가 증가 '이유 이잖아 엄격히 이하 9 이상이다.

당신은 다시 전체 식의 결과를 할당하여

+0

안녕하세요, 대단히 당신의 회신을 보내 주셔서 감사합니다. 이것은 나의 Uni 과정을위한 과거의 종이에 나를 혼란 시켰던 대답이었다. 그래서 나는 주로 내가 스크립트를 고치기보다는 결과를 얻은 이유에 주로 관심을 가졌습니다. 그러나 귀하의 회신 조에 대단히 감사합니다 – JAVAJoseph

3

++이 할당의 오른쪽 피연산자 number로 만드는 업데이트가 덮어 쓰기 작동 후

number = (int)math.sqrt(++number) , 

로 변경하는 경우 number.

이것은 JLS§15.26.1이 적용됩니다.

  1. 80 읽을 : 왼쪽 편 변수
  2. 가 할당 식의 오른쪽이 평가
  3. 것으로 결정

    1. : 여기에 대입 표현식에서 발생하는 상황 number에서
    2. number
    3. math.sqrt가 읽을 80 값으로 호출된다 (이 중요하지 않음)를 증가 (81) 보브
    4. math.sqrt의 결과는 상기 # 2 (8)에서 int
  4. 결과로 변환된다 number

참고 단계 2.1의 순서와 상기 2.2에 저장된다. 접미사 number++을 사용했기 때문입니다. ++number을 사용하면 주문이 취소됩니다 (결과가 달라질 수 있음).

오른쪽의 number++은 표현의 결과에 아무런 영향을 미치지 않습니다. (Java에서, 다른 언어에서는 컴파일러가 원하는대로 수행 할 수있는 정의되지 않은 동작으로 간주됩니다.)

특히 9 값을 얻을 것으로 예상 했으므로 ++은 할당 결과가 number에 저장된 후에 적용되지 않습니다. math.sqrt에 전달하면 number 값을 읽은 직후에 적용됩니다.

+0

환상적인 답변! –

+0

간단히 말하면, 부작용은'i ++'의 평가에서 없어서는 안될 부분입니다. 표현식의 결과를 사용하자 마자 부작용이 이미 적용됩니다. –

+0

안녕하세요, 믿을만한 유익한 답변을 보내 주셔서 대단히 감사합니다. 고마워, 조 – JAVAJoseph

0

java에서 포스트 증가는 표현식을 평가할 때 변수를 적용하고 명령문을 실행 한 후에는 변수에 영향을 미치지 않습니다. 따라서 변수는 81로 증가하고, 이전 값인 80은 sqrt에 전달되고, 결국 8이 할당됩니다.

+0

안녕하세요, 귀하의 회신 해 주셔서 감사합니다. 고마워. – JAVAJoseph