코드는 다음과 같습니다.
public class testplusplus {public static void main (String [] args) {int k = addafterreturn (10); System.out.println (k); // 출력 10 int k1 = AddBeForerEturn (10); System.out.println (K1); // output 11} public static int addbeforereturn (int i) {return ++ i; } public static int addAfterreturn (int i) {return i ++; }}바이트 코드 레벨에서
AddAfterreturn의 바이트 코드는 다음과 같습니다.
0 : iload_01 : iinc 0, 14 : Ireturn
간단합니다. iload_0은 로컬 변수 테이블에서 인덱스 된 요소의 값을 스택 상단에 두는 것을 의미합니다. 따라서 내가 통과 한 I의 값은 스택의 상단에 배치되며 iinc 0,1은 로컬 변수 테이블을 배치하는 것을 의미합니다.
인덱스 0이있는 요소는 1에 추가되고 마지막으로 Ireturn은 스택 상단에 int 값을 발신자의 스택 프레임에 넣습니다. (여기의 스택은 피연산자 스택입니다)
따라서 IINC 0과 1은 실제로 반환 된 값에 영향을 미치지 않으므로 리턴은 여전히 10입니다.
마찬가지로 AddBeforeReturn 바이트 코드는 다음과 같습니다.
0 : iinc 0, 13 : iload_04 : Ireturn
나는 그들 자신의 분석을 위해 모든 사람에게 맡길 것입니다. 실제로, 이것이 먼저 증가한 다음 스택에 넣는 것이 분명합니다. 따라서 반환 된 값은 실제로 증가합니다.
이제 내가 수정 한 인터뷰 질문을하겠습니다.
공개 클래스 TestPlusplus2 {static {x = 5; int y = 10; } 정적 int x, y; public static void main (String args []) {x-; myMethod (); System.out.println (x+y+++ x); } public static void myMethod () {y = x +++++ x; }}답을 알고 있습니까? 정답은 23입니다.
위의 것을 정말로 이해한다면이 질문도 매우 간단합니다. 우선, 메인을 실행하기 전에 X와 Y의 값을 알고 있습니다. 여기에는 클래스 로딩 메커니즘이 포함됩니다. 클래스 로딩의 준비 단계는 정적 변수를이 유형의 0 값에 할당합니다. int가 int 인 경우 0에 해당합니다. 클래스의 초기화 단계에서 클래스의 정적 블록 및 정적 변수 할당 동작은 코드 순서에 따라 수집되어 메소드를 생성합니다. 따라서이 테스트에서 x = 5, y = 0;
x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++는 리턴 후에 만 반환 I ++와 마찬가지로 후속 추가 작업을 실행하기 전에 1을 추가하지 않습니다 (Iretrun 명령어가 아닌 ILOAD 스택 조작 위의 ILOAD 스택 작업으로 반환을 이해할 수 있습니다). 그러나 첫 번째 추가는 4이지만 ++ X를 실행하기 전에 실제 X에서 이미 효과가 있었기 때문에 X는 이미+i 및 6입니다.
그런 다음 매우 간단한 x+y +++ x는 6+10+7입니다. 다행히 바이트 코드를 이해할 수 있다면 코드의 바이트 코드를 번역하고 바이트 코드를 사용하여 확인할 수 있으며 그러한 결과를 찾을 수 있습니다.
그룹의 큰 사람들이 제공 한 다른 예를 살펴 보겠습니다. 나는 또한 그것이 매우 기본적이라고 생각합니다.
public static int plus (int i) {try {++ i; System.out.println ( "try"); 반환 i ++; } 마침내 {system.out.println ( "최종"); i ++; // 반환 i; }} public static void main (String [] args) {System.out.println (test1.plus (5));}최종 출력이 얼마인지 생각할 수 있습니까? 주석을 제거하면 마침내 블록에서 돌아 오지 않는 이유입니다. 그것이 옳고 그른지에 관계없이, 특정 값은 항상 반환 될 수 있습니다.
요약
위의 내용은 편집자가 소개 한 Java 인터뷰 질문에서 I ++ 및 ++ I에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!