2014-12-23 4 views
3

나는 인터뷰에서 아래의 질문을 받았다.b = b ++와 b ++의 차이

int b = 0; 
b = b++; 
b = b++; 
b = b++; 
b = b++; 

모든 줄 실행 후 b 값은 어떻게됩니까? 출력은 모든 행에 대해 0으로 표시됩니다.

출력이 0,1,2,3으로 나오지 않는 이유는 무엇입니까? 자바

답변

6

표현식

b = b++ 

그러므로

int tmp = b; 
b = b + 1; 
b = tmp; 

결과와 동일하다.

(다른 언어에서 동일한 표현이 지정되지 않은 동작을 가지고 Undefined behavior and sequence points를 참조하십시오.).

2

을이 b = b++의 실행 순서이기 때문에 :

  1. 일부 임시로 b의 값을 가져가 (아마도 바이트 코드 레지스터로); 이것은 그것이 -Increment
  2. 단위 남기 b에서 증가 된 결과 (b++ 번째 부분)
  3. 은 (b 상기의 결과를 단계 (1)로부터의 값을 할당 저장 이후, b++의 첫 번째 부분 인 0을 볼 수 있듯이

    int temp = b; 
    b = b + 1; 
    return temp; 
    

    : =)

+0

바이트 코드 - '2 : iload_1 m 3 : iinc, 6 : istore_1'에서 차례대로 호출됩니다. 따라서, b의 값이 (로컬 변수 배열로부터) 스택으로 먼저 적재되고, 그 다음에 b의 값이 가져와지고, 증가되어 변수 b에 기록됩니다. 따라서 b는 1이 될 것입니다. 그러면 istore_1이 호출되어 스택에서 b의 값을 가져오고 변수 b (로컬 변수 배열)를 스택 (0)의 현재 값으로 덮어 씁니다.따라서 특정 구현에서 바이트 코드 수준에서 값은 덮어 쓰기됩니다. * :) – TheLostMind

+0

@TheLostMind : 예, 위의 # 2에서 먼저 작성한 다음 위의 # 3에서 덮어 씁니다. HotSpot이 핫스팟인지 궁금합니다. 핫스팟은 ... 고칠 것입니다. –

+0

핫스팟이 무엇이겠습니까?. 나는 단지 호기심이 많다. 'iinc'를 건너 뛰겠습니까? – TheLostMind

1

b++은과 동일은 이전 값을 반환하지만 b 값을 덮어 씁니다. 그러나 반환 된 (이전) 값을 b에 할당하므로 새 값이 덮어 쓰여지고 "무시됩니다".

b = ++b; //exactly the same as just "++b" 

이것은 점진 먼저 수행하고 새로운 값이 반환됩니다 : 당신이 쓰는 경우

의 차이는있을 것이다.

2

힌트 :

를 : 이미 설명하기 때문에

int b = 0, c; 
c = b++; 
c = b++; 
c = b++; 
c = b++; 
System.out.println(c); 

c 지금 할 것이다 당신이 생각처럼 3 만 있기 때문에 귀하의 질문에 당신이 b을 할당하고, 그것은이 같은입니다, 0을 얻을 것이다

int tmp = b; 
b = b + 1; 
b = tmp;