나는 인터뷰에서 아래의 질문을 받았다.b = b ++와 b ++의 차이
int b = 0;
b = b++;
b = b++;
b = b++;
b = b++;
모든 줄 실행 후 b 값은 어떻게됩니까? 출력은 모든 행에 대해 0으로 표시됩니다.
출력이 0,1,2,3으로 나오지 않는 이유는 무엇입니까? 자바
나는 인터뷰에서 아래의 질문을 받았다.b = b ++와 b ++의 차이
int b = 0;
b = b++;
b = b++;
b = b++;
b = b++;
모든 줄 실행 후 b 값은 어떻게됩니까? 출력은 모든 행에 대해 0으로 표시됩니다.
출력이 0,1,2,3으로 나오지 않는 이유는 무엇입니까? 자바
표현식
b = b++
그러므로
int tmp = b;
b = b + 1;
b = tmp;
결과와 동일하다.
(다른 언어에서 동일한 표현이 지정되지 않은 동작을 가지고 Undefined behavior and sequence points를 참조하십시오.).을이 b = b++
의 실행 순서이기 때문에 :
b
의 값을 가져가 (아마도 바이트 코드 레지스터로); 이것은 그것이 는 -Incrementb
에서 증가 된 결과 (b++
번째 부분)b
상기의 결과를 단계 (1)로부터의 값을 할당 저장 이후, b++
의 첫 번째 부분 인 0을 볼 수 있듯이 int temp = b;
b = b + 1;
return temp;
: =
)
b++
은과 동일은 이전 값을 반환하지만 b
값을 덮어 씁니다. 그러나 반환 된 (이전) 값을 b
에 할당하므로 새 값이 덮어 쓰여지고 "무시됩니다".
b = ++b; //exactly the same as just "++b"
이것은 점진 먼저 수행하고 새로운 값이 반환됩니다 : 당신이 쓰는 경우
의 차이는있을 것이다.
힌트 :
를 : 이미 설명하기 때문에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;
바이트 코드 - '2 : iload_1 m 3 : iinc, 6 : istore_1'에서 차례대로 호출됩니다. 따라서, b의 값이 (로컬 변수 배열로부터) 스택으로 먼저 적재되고, 그 다음에 b의 값이 가져와지고, 증가되어 변수 b에 기록됩니다. 따라서 b는 1이 될 것입니다. 그러면 istore_1이 호출되어 스택에서 b의 값을 가져오고 변수 b (로컬 변수 배열)를 스택 (0)의 현재 값으로 덮어 씁니다.따라서 특정 구현에서 바이트 코드 수준에서 값은 덮어 쓰기됩니다. * :) – TheLostMind
@TheLostMind : 예, 위의 # 2에서 먼저 작성한 다음 위의 # 3에서 덮어 씁니다. HotSpot이 핫스팟인지 궁금합니다. 핫스팟은 ... 고칠 것입니다. –
핫스팟이 무엇이겠습니까?. 나는 단지 호기심이 많다. 'iinc'를 건너 뛰겠습니까? – TheLostMind