Java에서 사후 증가 (i ++) 및 사전 증가 (++ i) 연산자는 어떻게 작동합니까?


99

이 Java 코드의 출력을 설명해 주시겠습니까?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

두 경우 모두 출력은 20입니다.


9
항상 모호한 진술을 피하십시오 :)
Prasoon Saurav

9
@Prasoon Saurav C 및 C ++와 달리 Java 및 C #은 엄격하게 정의 된 평가 순서를 가지고 있으므로 이러한 명령문은 모호하지 않습니다.
Pete Kirkham

12
나는 알고 있지만 여전히 그 진술은 실제적인 목적으로 사용될 수 없기 때문에 피해야합니다.
Prasoon Saurav


4
@PeteKirkham 6 년이 지났지 만 여전히이 상황에서 "모호함"이 모호하다는 점을 지적하고 싶습니다. "컴파일러가 무엇을 넣을지 모른다"를 의미하거나 "프로그래머"를 의미 할 수 있습니다. 그것이 무엇을 의미하는지 전혀 모릅니다. "
기금 모니카의 소송

답변:


150

도움이 되나요?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

요점은 ++a값 을 증가시키고 즉시 반환한다는 것입니다.

a++ 또한 값을 증가 시키지만 (백그라운드에서) 변수의 변경되지 않은 값을 반환합니다. 나중에 실행되는 것처럼 보입니다.


5
두 번째 항목에서 == 9입니까?
Pete Kirkham

1
나는 = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) post increment가 가장 높은 우선 순위를 가지므로 a ++가 먼저 실행됩니까?
rsirs

2
설명하기 쉬운 것에 대한 복잡한 예.
oznus

이 대답은 C #과 C ++에서 동일합니까?
워크 오버플로

여기서 a, b, c가 2 인 이유는 무엇입니까? int a = 1; int b = a++; int c = ++b;포스트 증분이므로 b가 1이 될 것으로 예상했습니다.
Dennis

202

++a증분하고 변수를 사용합니다.
a++변수를 사용한 다음 증분합니다.

당신이 가지고 있다면

a = 1;

그리고 당신은

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict는 특정 스 니펫을 설명 합니다.


62

두 경우 모두 먼저 값을 계산하지만 사후 증분에서는 이전 값을 유지하고 계산 후 반환합니다.

++ a

  1. a = a + 1;
  2. 반환 a;

a ++

  1. 온도 = a;
  2. a = a + 1;
  3. 반환 온도;

8
명확한 답
Kartik Chugh

2
이게 분명하게 이해하게 해준 거 였어요 .. 감사합니다.
rematnarab

22
i = ++a + ++a + a++;

이다

i = 6 + 7 + 7

Working : a에서 6까지 증가 (현재 값 6) + a에서 7까지 증가 (현재 값 7). 합계는 이제 13입니다. a (= 7)의 현재 값에 더한 다음 a를 8로 증가시킵니다. 합계는 20이고 할당 완료 후 a의 값은 8입니다.

i = a++ + ++a + ++a;

이다

i = 5 + 7 + 8

Working : a의 시작 값은 5입니다. 덧셈에 사용하고 6 (현재 값 6)으로 증가시킵니다. +의 다른 피연산자를 얻으려면 a를 현재 값 6에서 7로 증가시킵니다. 합계는 12이고 a의 현재 값은 7입니다. 다음으로 a를 7에서 8까지 증가시키고 (현재 값 = 8) 이전 합계 12에 더하여 20을 얻습니다.


이 문장은 오른쪽에서 왼쪽으로 또는 왼쪽에서 오른쪽으로 작동합니까?
Abhijeet

10

++aa평가되기 전에 증가 합니다. a++평가 a하고 증분합니다.

주어진 표현과 관련 :

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

위에서 사용한 괄호는 Java에서 암시 적으로 사용됩니다. 이런 식으로 용어를 살펴보면 쉽게 알 수 있습니다. 둘 다 교환 적이므로 동일합니다.


1
@ KlasLindbäck commutative는 두 식을 모두 바꿔도 동일한 결과를 얻을 수 있음을 의미합니다. 그래서 a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7).
Aurril

8

위의 예에서

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ a는 접두사 증가 연산자입니다.

  • 결과가 먼저 계산되고 저장됩니다.
  • 그런 다음 변수가 사용됩니다.

a ++는 후위 증분 연산자입니다.

  • 변수가 먼저 사용됩니다.
  • 그런 다음 결과가 계산되고 저장됩니다.

규칙을 기억하면 모든 것을 계산할 수 있도록 EZ!


4

당신이 의미한다고 가정

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

이것은 다음과 같이 평가됩니다.

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

그래서 나는 6 + 7 + 7 = 20이고 20이 인쇄됩니다.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

그래서 나는 5 + 7 + 8 = 20이고 20이 다시 인쇄됩니다.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

그리고 오른편을 모두 평가 한 후 (a에서 8로 설정 포함) THEN a는 6 + 7 + 7 = 20으로 설정되어 최종 시간에 20이 인쇄됩니다.


3

a이 5이면 a++표현식에 5를 제공하고 a나중에 ++a증가 하는 반면 a, 숫자를 표현식에 전달하기 전에 증가 합니다 ( a이 경우 표현식에 6이 주어짐).

그래서 당신은 계산

i = 6 + 7 + 7
i = 5 + 7 + 8

3

그러나 모든 진술을 결합하고 Java 8.1에서 실행하면 다른 답을 얻을 수 있다고 생각합니다. 적어도 내 경험이 말하는 것입니다.

코드는 다음과 같이 작동합니다.

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

3

사전 증가는 변수가 표현식에서 평가되기 전에 증가 함을 의미합니다. 사후 증가는 변수가 표현식에서 사용하기 위해 평가 된 후에 증가 함을 의미합니다.

따라서주의 깊게 살펴보면 세 가지 할당이 모두 산술적으로 동일하다는 것을 알 수 있습니다.


2

식에없는 경우 사전 증가 및 사후 증가는 동일합니다.

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
a=5; i=++a + ++a + a++;

이다

i = 7 + 6 + 7

작동 : 사전 / 사후 증가는 "오른쪽에서 왼쪽으로"연관성을 가지며 사전은 post보다 우선하므로 먼저 모든 사전 증가는로 해결됩니다 (++a + ++a) => 7 + 6. 그런 다음 a=7증분 => 7 + 6 + 7 =20a =8.

a=5; i=a++ + ++a + ++a;

이다

i=7 + 7 + 6

작업 : 전 / 후 증가뿐만 해결할 수 있도록 우선 이전 증분의 연관성 및 사전 "왼쪽에서 오른쪽으로 '포스트보다 우선 가지고 (++a + ++a) => 7 + 6그 때는이 a=7후 증가 제공 =>는 7 + 7 + 6 =20a =8.


0

이 모든 명령문을 다르게
실행하면 함께 실행하면 결과 => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.