English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
일반적으로 전置++는 먼저 변수의 값을1그런 다음 증가된 값을 사용하여 계산합니다.1그런 다음 증가된 값을 사용하여 계산합니다;후置++먼저 해당 값을 계산에 사용한 후, 해당 값을 증가시킵니다.1.
먼저 첫 번째 예제를 보겠습니다:
package test; public class Plus_Test01 { public static void main(String[] args) { int i = 100; i = i++; System.out.println(i); } }
결과는 무엇인가요?
다음을 보겠습니다:
package test; public class Plus_Test02 { public static void main(String[] args) { int k = 100; while (true) { if (k++ > 100) { // System.out.println(k); break; } System.out.println(k); } } }
결과는 무엇인가요?
실제로는 전置++또는 후置++모두 먼저 변수의 값을1그런 다음 계산을 계속합니다. 두 가지 방법의 진정한 차이는 다음과 같습니다:전置++은 변수의 값을1그런 다음 증가된 변수를 사용하여 계산합니다. 후置++먼저 변수를 일시적 변수에 할당한 후, 변수의 값을1그런 다음 해당 일시적 변수를 사용하여 계산합니다.
다음과 같은 코드 부분(전置++):
int i=1;
int j=++i*5;
실제 두 번째 문장은 다음과 같습니다:
i+=1; //i를 더하1
j=i*5; //增加值를1그 값과 계산하여 이 결과는 다음과 같습니다:10
다음과 같은 코드 부분(후置++):
int i=1;
int j=i++*5;
두 번째 문장은 다음과 같습니다:
int temp=i; // i를 임시 변수에 할당
i+=1; //i를 더하1
j=temp*5; //임시 변수와 계산하여 이 결과는 다음과 같습니다:5
첫 번째 예제는 다음과 같습니다:
int temp=i;
i+=1;
i=temp; //
따라서 결과는 불변해야 합니다, 즉100.
첫 번째 예제의汇编 코드는 다음과 같습니다:
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=1 0: bipush 100 2: istore_1 3: iload_1 4: iinc 1, 1 //로컬 변수의 두 번째에 추가1 7: istore_1 //로 저장 8: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; 11: iload_1 //로드된 매개변수는 스택의 두 번째입니다. 즉 여전히100 12: invokevirtual #22 // Method java/io/PrintStream.println:(I)V 15: return
두 번째 예제는 그리 어렵지 않습니다. 결과는101을 주의해보세요. 이제 이러한 오류를 저지르지 마세요. (순서는 다음과 같습니다: 먼저 temp=i, temp>을 비교하고100, , 명백히 성립하지 않습니다, i+=1로 이동하여 syso 문장에 대한 출력은 당연히101다시 반복하여 temp=i, temp>100, 이번에는 성립합니다, 그래서 i+=1직접 반복을 빠져나가고 while 내의 문장을 실행하지 않습니다).
두 번째 예제의汇编(예제 중에서만 선택):
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=1 0: bipush 100 //100를 스택에 쌓음 2: istore_1 //두 번째 local var에 저장(첫 번째 local var은 메서드 파라미터입니다) 3: iload_1 //두 번째 local var에서 로드 4: iinc 1, 1 //로컬 변수에2호 위치의 int 값이 증가1(로컬 변수 증가, 결과는 여전히 local var에 있으며 연산자 스택 정상1변하지 않음) 7: bipush 100 //100를 스택에 쌓음 9: if_icmple 15 //연산자 스택 정상의 두 int 정수 값을 비교하여 첫 번째가 두 번째보다 작거나 같으면 그 다음으로 이동15행 12: goto 25 //없으면 이동25행(즉 연산자 스택 정상1> 연산자 스택 정상2) 15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 18: iload_1 // //첫 번째 local var에서 로드 19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V //이 메서드를 호출 22: goto 3 //다시 돌아가:3، 다시 반복 25: return //나가기
세 번째 예제:
package test; public class Plus_Test03 { static int proPlus() { int i = 55; int j = ++i; return j; //56 } static int postPlus() { int i = 55; int j = i++; return j; //55 } public static void main(String[] args) { System.out.println(proPlus());//56 System.out.println(postPlus());//55 } }
세 번째 예제의 어셈블리:
static int proPlus(); descriptor: ()I flags: ACC_STATIC Code: stack=1, locals=2, args_size=0 0: bipush 55 //55스택에 넣기 2: istore_0 //int 타입 스택의 상단을 첫 번째 local var에 저장 3: iinc 0, 1 //첫 번째 local var 추가1 6: iload_0 //local var에서 로드 7: istore_1 //두 번째 local var에 저장 8: iload_1 //스택의 정상은 두 번째 local var입니다 9: ireturnstatic int postPlus(); descriptor: ()I flags: ACC_STATIC Code: stack=1, locals=2, args_size=0 0: bipush 55 2: istore_0 3: iload_0 //로드 4: iinc 0, 1 //첫 번째 local var 추가1 7: istore_1 8: iload_1 9: ireturn
보면, 전치++ 뒤에++의 차이점은 위의 파란(//첫 번째 local var 추가1) 부분, 이 두 부분은 반대입니다. 전치의 경우, local var의 수를 추가합니다.1그런 다음 스택에 로드한 후, 후치는 먼저 스택 local var에서 로드한 후 local var의 값을 추가합니다.1相当于留下了一个备份。
결론:
1. 전치와 후치++변수의 값을 먼저 추가1그렇지 않고 전치++먼저 추가1그런 다음 연산하고, 후치++연산 후 추가1.
2. 프로그램에서는, 후치++변수를 임시 변수에 할당한 후, 변수의 값을 더합니다.1그런 다음, 해당 임시 변수를 연산에 사용합니다.
3. 명령어에서는, 후치++增值 명령어(iinc)를 실행하기 전에, 변수의 값을 스택에 넣고, 증가 명령어를 실행한 후에는 이전에 스택에 넣은 값을 사용합니다.
이 문서를 통해 전체적으로 전前置를 이해하고자 합니다.++뒤에++의 연산 차이점을 알려주고, 이 사이트에 대한 모든 지원에 감사합니다!