Java에서 x ++와 ++ x 사이에 차이점이 있습니까?


113

Java에서 ++ x와 x ​​++ 사이에 차이점이 있습니까?


53
... 동일한 답변을 토런트를 큐
skaffman

5
... 그리고에서 얻을 동일한 답변의 첫 번째의 upvoting ...
skaffman

9
가장 빨리 전리품으로 이동하고 가장 오래된 순으로 정렬하고 upvote를 클릭하십시오. ohowoho.
dotjoe 2009-07-07

1
나는 그것을 가지고 있다고 확신했다! 어쨌든 Emil의 대답이 더 좋습니다.
Victor

답변:


290

++ x는 사전 증가라고하고 x ++는 사후 증가라고합니다.

int x = 5, y = 5;

System.out.println(++x); // outputs 6
System.out.println(x); // outputs 6

System.out.println(y++); // outputs 5
System.out.println(y); // outputs 6

62
좋은 설명, 1 ++. 아차, ++ 1 :
nawfal

67

++ x는 x 값을 증가시킨 다음 x를 반환합니다.
x ++는 x 값을 반환 한 다음 증가합니다.

예:

x=0;
a=++x;
b=x++;

코드가 실행 된 후 a와 b는 모두 1이되지만 x는 2가됩니다.


10
예 +1 많은, 이것은입니다 설명 : 예와 함께
제레미 스미스

1
네, 처음에 명확한 산문 설명으로 인해 이것도 찬성했습니다. (흠, 당신이 현재 의견 필기체를 할 수 있습니다 ... 몰랐 )
Jonik

17

이를 접미사 및 접두사 연산자라고합니다. 둘 다 변수에 1을 더하지만 명령문의 결과에는 차이가 있습니다.

int x = 0;
int y = 0;
y = ++x;            // result: y=1, x=1

int x = 0;
int y = 0;
y = x++;            // result: y=0, x=1

suffix그래?
HyperNeutrino

10

예,

int x=5;
System.out.println(++x);

인쇄 6하고

int x=5;
System.out.println(x++);

인쇄 5됩니다.


1
@Tom, 나는 투표 방법을 고려하고 있었으므로 여기에 내 해석이 있습니다 .Emil H의 대답을 선호하는 작은 이유 중 하나는 그의 예제 코드가 / 약간 /보다 유익하다는 것입니다.
Jonik

조닉. True, 'preincrement'및 'postincrement'키워드도 포함됩니다.

이 "답변"은 테스트 케이스 출력을 알려주고 출력이 답이 아니라고 생각합니다. 반대로, 일반적으로 일부 코드 실행의 (예기치 않은) 결과는 질문으로 이어집니다. 따라서 내 반대표.
Alberto de Paola 2012

8

나는 그것의 최근 dup 중 하나에서 여기에 도착했다. 그리고이 질문은 대답 이상이지만, 나는 코드를 디 컴파일하고 "아직 다른 대답"을 추가하는 것을 도울 수 없었다 :-)

정확하고 (아마도 약간 현명한)

int y = 2;
y = y++;

다음으로 컴파일됩니다.

int y = 2;
int tmp = y;
y = y+1;
y = tmp;

javacY.java수업의 경우 :

public class Y {
    public static void main(String []args) {
        int y = 2;
        y = y++;
    }
}

그리고 javap -c Y, 다음 jvm 코드를 얻습니다 ( Java Virtual Machine Specification 의 도움으로 주요 방법에 대해 주석을 달 수 있음 ).

public class Y extends java.lang.Object{
public Y();
  Code:
   0:   aload_0
   1:   invokespecial  #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_2 // Push int constant `2` onto the operand stack. 

   1:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.

   2:   iload_1  // Push the value (`2`) of the local variable at index `1` (`y`)
                 // onto the operand stack

   3:   iinc  1, 1 // Sign-extend the constant value `1` to an int, and increment
                   // by this amount the local variable at index `1` (`y`)

   6:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.
   7:   return

}

따라서 드디어 :

0,1: y=2
2: tmp=y
3: y=y+1
6: y=tmp

7

컴퓨터가 실제로하는 일을 고려할 때 ...

++ x : 메모리에서 x로드, 증가, 사용, 메모리에 다시 저장.

x ++ : 메모리에서 x를로드하고, 사용하고, 증가시키고, 메모리에 다시 저장합니다.

고려 : a = 0 x = f (a ++) y = f (++ a)

여기서 함수 f (p)는 p + 1을 반환합니다.

x는 1 (또는 2)입니다.

y는 2 (또는 1)입니다.

그리고 거기에 문제가 있습니다. 컴파일러 작성자가 검색 후, 사용 후 또는 저장 후 매개 변수를 전달 했습니까?

일반적으로 x = x + 1을 사용하십시오. 훨씬 간단합니다.


5

Java에서는 x ++와 ++ x 사이 에 차이가 있습니다.

++ x는 접두사 형식입니다. 변수 표현식을 증분 한 다음 표현식에서 새 값을 사용합니다.

예를 들어 코드에서 사용되는 경우 :

int x = 3;

int y = ++x;
//Using ++x in the above is a two step operation.
//The first operation is to increment x, so x = 1 + 3 = 4
//The second operation is y = x so y = 4

System.out.println(y); //It will print out '4'
System.out.println(x); //It will print out '4'

x ++는 접미사 형식입니다. 변수 값은 표현식에서 처음 사용 된 다음 연산 후에 증가합니다.

예를 들어 코드에서 사용되는 경우 :

int x = 3;

int y = x++;
//Using x++ in the above is a two step operation.
//The first operation is y = x so y = 3
//The second operation is to increment x, so x = 1 + 3 = 4

System.out.println(y); //It will print out '3'
System.out.println(x); //It will print out '4' 

이것이 분명하기를 바랍니다. 위의 코드를 실행하고 재생하면 이해하는 데 도움이됩니다.


3

예.

public class IncrementTest extends TestCase {

    public void testPreIncrement() throws Exception {
        int i = 0;
        int j = i++;
        assertEquals(0, j);
        assertEquals(1, i);
    }

    public void testPostIncrement() throws Exception {
        int i = 0;
        int j = ++i;
        assertEquals(1, j);
        assertEquals(1, i);
    }
}

2

예, ++ X를 사용하면 X + 1이 표현식에 사용됩니다. X ++를 사용하면 X가 표현식에 사용되고 X는 표현식이 평가 된 후에 만 ​​증가합니다.

따라서 X = 9이면 ++ X를 사용하면 값 10이 사용되고 그렇지 않으면 값 9가 사용됩니다.


2

다른 많은 언어와 같은 경우 간단한 시도를 원할 수 있습니다.

i = 0;
if (0 == i++) // if true, increment happened after equality check
if (2 == ++i) // if true, increment happened before equality check

위와 같은 일이 발생하지 않으면 동등 할 수 있습니다.


2

예, 반환 된 값은 각각 증분 전후의 값입니다.

class Foo {
    public static void main(String args[]) {
        int x = 1;
        int a = x++;
        System.out.println("a is now " + a);
        x = 1;
        a = ++x;
        System.out.println("a is now " + a);
    }
}

$ java Foo
a is now 1
a is now 2

1

좋아, 나는 최근에 고전적인 스택 구현을 확인할 때 동일한 문제를 발견했기 때문에 여기에 도착했습니다. 이것은 연결된 목록보다 조금 더 빠른 스택의 배열 기반 구현에서 사용된다는 점을 상기시켜줍니다.

아래 코드, 푸시 및 팝 기능을 확인하십시오.

public class FixedCapacityStackOfStrings
{
  private String[] s;
  private int N=0;

  public FixedCapacityStackOfStrings(int capacity)
  { s = new String[capacity];}

  public boolean isEmpty()
  { return N == 0;}

  public void push(String item)
  { s[N++] = item; }

  public String pop()
  { 
    String item = s[--N];
    s[N] = null;
    return item;
  }
}

1

네, 차이가 있습니다. x ++ (postincrement)의 경우 x의 값이 표현식에 사용되고 x는 표현식이 평가 된 후 1 씩 증가합니다. 반면에 ++ x (preincrement), x + 식에 1이 사용됩니다. 예를 들어 :

public static void main(String args[])
{
    int i , j , k = 0;
    j = k++; // Value of j is 0
    i = ++j; // Value of i becomes 1
    k = i++; // Value of k is 1
    System.out.println(k);  
}

1

질문은 이미 답변되었지만 내 쪽에서도 추가 할 수 있습니다.

우선 ++ 는 1 씩 증가하고 - 는 1 씩 감소를 의미합니다.

이제 X ++ 수단 증가는 X 이 선 후에 ++ X 수단 증가는 X 이 행하기 전에.

이 예 확인

class Example {
public static void main (String args[]) {
      int x=17,a,b;
      a=x++;
      b=++x;
      System.out.println(“x=” + x +“a=” +a);
      System.out.println(“x=” + x + b=” +b);
      a = x--;
      b = --x;
      System.out.println(“x=” + x + a=” +a);
      System.out.println(“x=” + x + b=” +b);
      }
}

다음과 같은 출력이 제공됩니다.

x=19 a=17
x=19 b=19
x=18 a=19
x=17 b=17

1
이 반응은 몇 마디의 설명을 동반하면 더 좋을 것입니다.
Thom

0

i ++에서는 postincrement라고하며 값은 증분되는 모든 컨텍스트에서 사용됩니다. ++ i는 값을 먼저 증가시킨 다음 컨텍스트에서 사용합니다.

어떤 상황에서도 사용하지 않는다면 무엇을 사용하든 상관 없지만 사후 증가는 관례 적으로 사용됩니다.


0

큰 차이가 있습니다.

대부분의 답변이 이미 이론을 지적 했으므로 쉬운 예를 지적하고 싶습니다.

int x = 1;
//would print 1 as first statement will x = x and then x will increase
int x = x++;
System.out.println(x);

이제 보자 ++x:

int x = 1;
//would print 2 as first statement will increment x and then x will be stored
int x = ++x;
System.out.println(x);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.