자바에서는 x++와 ++x의 차이가 있나요?
자바에서는 ++x와 x++의 차이가 있나요?
++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
네.
는 x 의 시킨 후 x++x 의 x 를 한다.
x++는 x의 값을 시킵니다.
예:
x=0;
a=++x;
b=x++;
코드가 실행된 후 a와 b는 모두 1이 되지만 x는 2가 됩니다.
이들은 postfix 연산자와 prefix 연산자로 알려져 있습니다.둘 다 변수에 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
네.
int x=5;
System.out.println(++x);
합니다.를 인쇄합니다.6
...
int x=5;
System.out.println(x++);
합니다.를 인쇄합니다.5
.
자바에서는 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++는 postfix 형식입니다.변수 값은 처음에 식에서 사용된 후 연산 후에 증가합니다.
예를 들어 코드에서 사용되는 경우:
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'
이게 확실하길 바라.위의 코드를 실행하고 재생하면 이해에 도움이 될 것입니다.
저는 최근 듀프 중 하나에서 이곳에 도착했고, 이 질문은 대답 이상의 것이었지만, 코드를 해독하고 "또 다른 대답"을 추가하지 않을 수 없었습니다:-)
정확히 말하면 (아마도 약간 현학적인)
int y = 2;
y = y++;
는 다음과 같이 컴파일 됩니다.
int y = 2;
int tmp = y;
y = y+1;
y = tmp;
당신이 가 if if if ifjavac
★★★★★★★★★★★★★★★★★」Y.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
컴퓨터가 실제로 하는 일을 생각하면...
++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을 사용합니다.그게 훨씬 간단해.
네.
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);
}
}
예, ++X를 사용하면 X+1이 식에 사용됩니다.X++를 사용하면 X가 식에 사용되며 X는 식이 평가된 후에만 증가합니다.
따라서 X = 9이면 ++X를 사용하여 값 10이 사용되고 그렇지 않으면 값 9가 사용됩니다.
다른 많은 언어와 마찬가지로 간단한 시도도 할 수 있습니다.
i = 0;
if (0 == i++) // if true, increment happened after equality check
if (2 == ++i) // if true, increment happened before equality check
위와 같이 되지 않으면 동등할 수 있습니다.
네, 반환되는 값은 각각 증분 전 및 증분 전 값입니다.
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
네, 저는 최근에 기존의 스택 구현을 확인할 때 같은 문제를 발견했기 때문에 이 문제를 알게 되었습니다.이는 링크드 리스트보다 약간 빠른 스택의 어레이 기반 구현에서 사용되고 있음을 상기시켜 드립니다.
아래 코드, 푸시 및 팝 펑크를 확인하십시오.
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;
}
}
예, 차이가 있습니다. x++(post-increment)의 경우 식에 x 값이 사용되고 식 평가 후 x 값이 1씩 증가합니다. 반면 ++x(pre-increment), 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의 감소를 의미합니다.
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
i++에서는 post increment라고 불리며 값은 모든 컨텍스트에서 사용되며 ++i는 값을 먼저 증가시킨 후 컨텍스트에서 사용합니다.
어떤 문맥에서도 사용하지 않는 경우에는 무엇을 사용하든 상관없습니다만, 인크리먼트는 관례에 따라 사용됩니다.
큰 차이가 있다.
대부분의 답변이 이미 이론을 지적하고 있기 때문에 간단한 예를 들어 보겠습니다.
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);
public static void main(String[] args) {
int a = 1;
int b = a++; // this means b = whatever value a has but, I want to
increment a by 1
System.out.println("a is --> " + a); //2
System.out.println("b is --> " + b); //1
a = 1;
b = ++a; // this means b = a+1
System.out.println("now a is still --> " + a); //2
System.out.println("but b is --> " + b); //2
}
이렇게 생각해 보세요.왼쪽에서 오른쪽으로 마주친 것을 먼저 하세요.처음에 x가 표시되어 있는 경우는, 그 값이 현재의 처리식을 평가하는 데 사용되고, 먼저 증분(+)이 표시되어 있는 경우는, 변수의 현재치에 1을 더하고, 식의 평가를 속행합니다.간단하죠.
언급URL : https://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java
'sourcecode' 카테고리의 다른 글
event.prevent Default() 함수가 IE에서 작동하지 않음 (0) | 2022.11.17 |
---|---|
순차적으로 NPM 스크립트 실행 (0) | 2022.11.17 |
MySQL의 그룹화 전 순서 (0) | 2022.11.17 |
각 루프에 비동기/대기 사용 (0) | 2022.11.17 |
mariadb 5.5에서10으로 업그레이드/업데이트 (0) | 2022.11.17 |