"x = x++" 뒤의 x는 무엇입니까?
이것이 실행되면 (커튼 뒤에서) 어떻게 됩니까?
int x = 7;
x = x++;
되면 POST가 실행됩니다.저는 이것을 편집하고 실행했습니다. x
전체 진술이 끝나도 여전히 7입니다.제 책에는 이렇게 적혀 있어요.x
증!!
x = x++;
와 동등하다
int tmp = x;
x++;
x = tmp;
x
그런데 옛날 을 할당하고 있어요.x
기기자자자자되되되되되
x = x++;
x++
increx
오래된 값을 반환합니다.x =
는 오래된 값을 자신에게 다시 할당합니다.
그래서 결국엔x
는 초기값으로 다시 할당됩니다.
스테이트먼트:
x = x++;
는 다음과 같습니다.
tmp = x; // ... this is capturing the value of "x++"
x = x + 1; // ... this is the effect of the increment operation in "x++" which
// happens after the value is captured.
x = tmp; // ... this is the effect of assignment operation which is
// (unfortunately) clobbering the incremented value.
한마디로 효과가 없다.
요점은 다음과 같습니다.
Postfix increment/decrement 식의 값은 increment/decrement가 발생하기 전의 오퍼랜드 값입니다.(Prefix 형식의 경우 값은 조작 후의 오퍼랜드 값입니다).
할당 표현의 RHS는 값을 LHS에 할당하기 전에 완전히 평가된다(증가, 감소 및/또는 기타 부작용 포함).
C 및 C++와는 달리 Java 표현식의 평가순서는 완전히 지정되며 플랫폼 고유의 변동은 발생하지 않습니다.컴파일러는 현재 스레드의 관점에서 코드를 실행한 결과가 변경되지 않는 경우에만 작업을 재정렬할 수 있습니다.이 경우, 컴파일러는 전체 스테이트먼트를 최적화하는 것이 허용됩니다.그것은 no-op이라는 것을 증명할 수 있기 때문입니다.
아직 명확하지 않은 경우:
- "x = x++;"는 거의 모든 프로그램에서 실수입니다.
- OP(원래 질문의 경우!)는 "x = x++;"가 아니라 "x++;"를 의미했을 것입니다.
- auto inc/decrement와 동일한 변수에 대한 할당을 조합하는 문장은 이해하기 어렵기 때문에 정확성에 관계없이 피해야 합니다.그렇게 코드를 쓸 필요는 없다.
FindBugs나 PMD와 같은 코드 체커가 이와 같은 코드를 의심스럽다고 플래그를 붙이기를 바랍니다.
int x = 7;
x = x++;
C 에서는 동작이 정의되어 있지 않습니다.Java 의 경우는, 다음의 회답을 참조해 주세요.컴파일러의 동작에 따라 다릅니다.
★★★★★★★★★★★★★★★★와 같은 구조x = x++;
「」이 을 의미하는지 잘못 있습니다.++
연산자는 다음 작업을 수행합니다.
// original code
int x = 7;
x = x++;
이것도 이명명를 삭삭삭삭++
★★★★★★★★★★★★★★★★★★:
// behaves the same as the original code
int x = 7;
int tmp = x; // value of tmp here is 7
x = x + 1; // x temporarily equals 8 (this is the evaluation of ++)
x = tmp; // oops! we overwrote y with 7
이제 원하는 대로 다시 작성하겠습니다.
// original code
int x = 7;
x++;
서 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」++
연산자는 다음과 같은 표현과 달리 변수를 수정합니다.x + x
는 int로 .x
변경되지 않았습니다.를 들면, 「 것」이라고 하는 해 주세요.for
디세이블로그:
for(int i = 0; i < 10; i++)
{
System.out.println(i);
}
점에 주의:i++
안에? 저 안에?같은 오퍼레이터입니다. 쓸 도 있어요.for
다음과 같이 루프하면 동일하게 동작합니다.
for(int i = 0; i < 10; i = i + 1)
{
System.out.println(i);
}
는 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.++
대부분의 경우 연산자를 더 큰 식에서 사용합니다.사전 대 사후 증가에서 원래 변수를 수정할 때의 미묘한 차이 때문에(++x
★★★★★★★★★★★★★★★★★」x++
추적하기 어려운 미묘한 버그를 도입하는 것은 매우 간단합니다.
할당 모두 x가 하지만, 는 x의 입니다.when the value is pushed onto the stack
»Case1
전에 후됩니다). 즉, push는 증분 합니다(기본적으로 push는 아무것도 않습니다.
»Case2
됩니다).
케이스 1:
int x=7;
x=x++;
바이트 코드:
0 bipush 7 //Push 7 onto stack
2 istore_1 [x] //Pop 7 and store in x
3 iload_1 [x] //Push 7 onto stack
4 iinc 1 1 [x] //Increment x by 1 (x=8)
7 istore_1 [x] //Pop 7 and store in x
8 return //x now has 7
케이스 2:
int x=7;
x=++x;
바이트 코드
0 bipush 7 //Push 7 onto stack
2 istore_1 [x] //Pop 7 and store in x
3 iinc 1 1 [x] //Increment x by 1 (x=8)
6 iload_1 [x] //Push x onto stack
7 istore_1 [x] //Pop 8 and store in x
8 return //x now has 8
- 여기서 스택은 오퍼랜드 스택을 참조합니다.로컬: x 인덱스: 1 유형: int
Post Increment 연산자는 다음과 같이 작동합니다.
- 피연산자의 이전 값을 저장합니다.
- 오퍼랜드 값을 늘립니다.
- 오퍼랜드의 이전 값을 반환합니다.
그래서 그 진술은
int x = 7;
x = x++;
는 다음과 같이 평가됩니다.
- x는 값 7로 초기화됩니다.
- post increment 연산자는 반환할 이전 값 x, 즉 7을 저장합니다.
- x가 증가하므로 x는 8이 됩니다.
- 이전 값인 7을 반환하고 다시 x에 할당되므로 x는 다시 7이 됩니다.
따라서 x는 실제로 증가하지만 x++는 결과를 x에 다시 할당하므로 x 값은 이전 값으로 덮어씁니다.
」합니다.x = x++;
'을 8이 됩니다.x = ++x;
x가 호출된 후에 증가하므로 x는 여전히 7입니다. x가 호출되었을 때 ++x는 8과 같습니다.
「」의을 .x
★★★★★★★★★★★★★★★★★★★★★★★.x = ++x
의 다른 do8을 수 .
x++; // don't re-assign, just increment
System.out.println(x); // prints 8
x++는 변수를 할당한 후 값을 증가시키기 때문입니다.따라서 이 행의 실행 중 및 실행 중:
x++;
varialbe x는 원래 값(7)을 가지지만 다음과 같은 다른 행에서 x를 다시 사용합니다.
System.out.println(x + "");
8을 드리겠습니다.
과제문에서 증분값 x를 사용하려면 다음 명령을 사용합니다.
++x;
그러면 x가 1씩 증가하고 그 값이 변수 x에 할당됩니다.
[Edit]는 x = x++ 대신 x++일 뿐이며, x의 원래 값을 자신에게 할당하기 때문에 실제로는 그 줄에 아무것도 하지 않습니다.
그럼 어떻게 되는 거죠?int x = 7; x = x++;
?
ans ->x++
는 처음에 x 값을 식에 사용한 후 1만큼 증가시키는 것을 의미합니다.
당신의 경우는 이렇게 됩니다.RHS의 x 값은 LHS의 변수x에 복사되고 다음으로 값이 복사됩니다.x
1씩 증가합니다.
유사하게++x
수단->
먼저 x의 값을 1씩 늘린 다음 expression에서 사용합니다.
그래서 당신의 경우, 만약x = ++x ; // where x = 7
8의 값을 얻을 수 있습니다.
보다 명확하게 하기 위해 다음 코드를 실행하는 printf 문장의 수를 확인해 보십시오.
while(i++ <5)
printf("%d" , ++i); // This might clear your concept upto great extend
++x
사전 준비 완료->
x는 사용하기 전에 증가합니다.
x++
사후 처리됨->
x는 사용 후 증가합니다.
int x = 7; -> x get 7 value <br>
x = x++; -> x get x value AND only then x is incremented
이 은 '먹다'라는 뜻입니다x++
하지 않다x = x+1
이유:
int x = 7; x = x++;
x is 7
int x = 7; x = x = x+1;
x is 8
지금은 좀 이상한 것 같아요.
int x = 7; x = x+=1;
x is 8
컴파일러에 의존합니다!
가장 간단한 설명!
이는 피연산자가 포스트 인크리먼트를 한 후 ++가 되면 값이 먼저 변수에 할당되고 다음으로 증가하기 때문입니다.x 값이 8이 될 것으로 예상되지만 다음과 같이 값을 미리 늘려야 합니다.
x = x++;
이 연산자는 증가 후 연산자입니다."피연산자의 값을 사용한 다음 피연산자를 증가시킨다"로 이해해야 합니다.
"피연산자를 늘린 다음 피연산자의 값을 사용"과 같이 역순으로 발생시키려면 다음과 같이 사전 증가 연산자를 사용해야 합니다.
x = ++x;
이 연산자는 먼저 x 값을 1씩 증가시킨 다음 값을 x에 다시 할당합니다.
이 논란은 코드나 생각만으로 해결할 수 있다고 생각합니다.
i+++i를 함수로 간주합니다(예를 들어 Func1과 Func2).
ii=7;i=7;
Func1(i++) 7, Func2(+i) 8입니다.내부적으로는 두 함수가 i에서8로 증가하지만 다른 값을 반환합니다.
따라서 i = i++는 함수를 Func1이라고 합니다.함수 내 i는 8로 증가하지만, 완료되면 7이 반환됩니다.
따라서 최종적으로 7이 i에 할당됩니다(따라서 결국 i = 7).
이는 증가 후 연산자를 사용했기 때문입니다.다음 코드 행에서
x = x++;
x 값을 x에 할당하면 x++ 값이 x에 할당되면 x가 증가합니다.그것이 증가 후 연산자가 일하는 방식이다.스테이트먼트가 실행된 후에 동작합니다.따라서 코드에서는 x가 먼저 반환된 후 증분됩니다.
만약 그랬다면
x = ++x;
사전 증가 연산자를 사용했기 때문에 정답은 8입니다.그러면 x 값이 반환되기 전에 값이 먼저 증가합니다.
언급URL : https://stackoverflow.com/questions/7911776/what-is-x-after-x-x
'programing' 카테고리의 다른 글
갱신된 라이프 사이클이벤트: 특정 요소에 대해서만 dom 갱신 후 워처를 사용하여 동작 (0) | 2022.07.03 |
---|---|
Vue-Router가 데이터를 다른 컴포넌트로 전달 (0) | 2022.07.03 |
N개의 "구분이 되는" 색상을 자동으로 생성하는 방법은 무엇입니까? (0) | 2022.07.03 |
URL 작성 및 파라미터에서 Vue.js Vuex 상태 설정 (0) | 2022.07.03 |
Google Auth Signin을 사용한 Vuejs 글로벌 함수 (0) | 2022.07.03 |