일반적으로 사전 위치 ++는 먼저 변수의 값을 1에 추가 한 다음 1을 추가 한 후 값을 사용하여 작업에 참여하는 것으로 여겨집니다. Post-Position ++는 먼저 값을 사용하여 작업에 참여한 다음 값을 1에 추가합니다.
첫 번째 예를 살펴 보겠습니다.
패키지 테스트; public class plus_test01 {public static void main (String [] args) {int i = 100; i = i ++; System.out.println (i); }}결과가 무엇인지 맞춰보세요?
두 번째를 보자.
패키지 테스트; public class plus_test02 {public static void main (String [] args) {int k = 100; while (true) {if (k ++> 100) {// system.out.println (k); 부서지다; } system.out.println (k); }}}결과가 무엇인지 맞춰보세요?
실제로, 사전-++ 또는 post-++이든, 변수의 값은 먼저 계산하기 전에 1 씩 증가합니다. 두 가지의 실제 차이점은 다음과 같습니다. pre-++는 변수의 값을 1만큼 추가하고 추가 값을 사용하여 계산을 수행하는 반면, Post-++는 먼저 변수를 임시 변수에 할당 한 다음 변수의 값에 1을 추가 한 다음 해당 변수를 사용하여 계산을 수행합니다.
다음 코드 스 니펫 (Prefix ++)의 경우 :
int i = 1;
int j = ++ i*5;
실제로 두 번째 문장은 다음과 같습니다.
I+= 1; // 1에 1을 추가합니다
j = i*5; // 1을 추가 한 후 값을 계산하면 결과는 다음과 같습니다.
그리고 다음 코드 스 니펫 (post-++)의 경우 :
int i = 1;
int j = i ++*5;
두 번째 문장은 다음과 같습니다.
int temp = i; // 임시 변수에 I를 할당합니다
I+= 1; // 1에 1을 추가합니다
j = 온도*5; // 임시 변수를 계산하면 결과는 다음과 같습니다.
첫 번째 예는 다음과 같습니다.
int temp = i;
I+= 1;
I = 온도; //
따라서 결과는 변경되지 않아야합니다.
첫 번째 예제의 조립 코드는 다음과 같습니다.
public static void main (java.lang.string []); ([ljava/lang/string;) v 플래그 : Acc_public, Acc_static 코드 : stack = 2, locals = 2, args_size = 1 0 : bipush 100 2 : istore_1 3 : iload_1 4 : iinc 1, 1 // local var var + 1 7 : istore_1 // getstatic #16 // Java/Lang/System.out : ljava/io/printstream; 11 : iload_1 //로드 된 매개 변수는 스택에서 두 번째입니다.
두 번째 예에서는 실제로 어렵지 않지만 결과는 101입니다. 프로세스에주의를 기울이면 앞으로 그러한 실수를 할 수 없습니다. (프로세스는 다음과 같습니다. 첫 번째 Temp = i, temp> 100, 분명히 사실이 유지되지 않습니다. SYSO 문장에 i+= 1을 건너 뛰십시오. 물론 인쇄 101, 다시 루프, 또한 temp = i, temp> 100, 이번에는 사실입니다. 그리고 i+= 1, 직접 실행되지 않습니다).
두 번째 예제의 컴파일 (기본 메소드 만 선택) :
public static void main (java.lang.string []); 디스크립터 : ([ljava/lang/string;) v 플래그 : acc_public, acc_static code : stack = 2, locals = 2, args_size = 1 0 : bipush 100 // 100 푸시 스택 2 : istore_1 // 두 번째 로컬 var (첫 번째 로컬 var)에 저장) 3 : iload_1 // 4 var에서 1, 1, 1, 1, 1, iinc var. 로컬 VAR의 위치 2 (로컬 변수 증가, 결과는 여전히 로컬 VAR에 있으며, 피연산자 스택의 상단 1은 변경되지 않습니다) 7 : Bipush 100 // 100 푸시 스택 9 : if_icmple 15 // 피연산자 스택의 상단에있는 두 개의 int 정수 값을 비교합니다. 첫 번째 값이 두 번째 범위보다 작거나 동일하다면, 25 라인으로 점프 할 수 있습니다. 오페라 스택 2) 15 : GetStatic #2 // 필드 Java/Lang/System.out : Ljava/IO/PrintStream; 18 : iload_1 // // 첫 번째로드로드 var 19 : invokevirtual #3 // 메소드 java/io/printstream.println : (i) v //이 메소드를 호출합니다 22 : goto 3 // 다시 3으로 점프하고 다시 루프를 다시 꺼냅니다.
세 번째 예 :
패키지 테스트; public class plus_test03 {static int proplus () {int i = 55; int j = ++ i; j; // 56} static int postPlus () {int i = 55; int j = i ++; j; // 55} public static void main (String [] args) {System.out.println (proplus ()); // 56 System.out.println (postPlus ()); // 55}}세 번째 예제의 편집 :
정적 int proplus (); 디스크립터 : () I 플래그 : Acc_static 코드 : stack = 1, locals = 2, args_size = 0 0 : bipush 55 // 55 스택 2 : istore_0 // int 스택의 상단을 첫 번째 로컬 var 3에 int 스택의 상단을 저장합니다. 1 // Local var 7 : istore_1 // 1/11 // // 스택의 상단은 두 번째 로컬 var 9입니다 : ireturnstatic int postPlus (); 디스크립터 : () I 플래그 : Acc_static 코드 : stack = 1, locals = 2, args_size = 0 0 : bipush 55 2 : istore_0 3 : iload_0 // 스택에로드 4 : iinc 0, 1 // 첫 번째로로드 var var 1 7 : istore_1 8 : iload_1 9 : ireturn
전면 ++와 리어 ++의 차이는 위의 파란색 부분 (// 첫 번째 로컬 var 1)임을 알 수 있습니다. 전임자의 경우 로컬 VAR의 숫자가 1을 추가 한 다음 스택에로드하고 후자는 스택 로컬 VAR에서 스택에로드 된 다음 로컬 VAR이 추가됩니다. 이는 백업을 떠나는 것과 같습니다.
결론적으로 :
하나. 사전 포지션 및 포스트 포지션 ++는 모두 예비 위치 ++에 1을 추가 한 다음 계산하는 동안 먼저 ++ 이상을 계산하는 대신 1을 가변 값에 추가합니다.
둘. 프로그래밍 방식으로 말하면, Post-++는 먼저 변수를 임시 변수에 할당 한 다음 변수의 값을 1 씩 추가 한 다음 임시 변수를 사용하여 작업에 참여합니다.
삼. 지침 관점에서, 부가가치 명령어 (IINC)를 실행하기 전에 변수의 값이 스택으로 푸시됩니다. 부가가치 명령어를 실행 한 후 스택에 푸시 된 값이 사용됩니다.
이 기사를 통해 사전 위치 ++와 사후 위치 ++ 작업의 차이점을 철저히 이해하기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!