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)를 실행하기 전에, 변수의 값을 스택에 넣고, 증가 명령어를 실행한 후에는 이전에 스택에 넣은 값을 사용합니다.

이 문서를 통해 전체적으로 전前置를 이해하고자 합니다.++뒤에++의 연산 차이점을 알려주고, 이 사이트에 대한 모든 지원에 감사합니다!

추천해드립니다