programing

"x = x++" 뒤의 x는 무엇입니까?

firstcheck 2022. 7. 3. 19:16
반응형

"x = x++" 뒤의 x는 무엇입니까?

이것이 실행되면 (커튼 뒤에서) 어떻게 됩니까?

int x = 7;
x = x++;

되면 POST가 실행됩니다.저는 이것을 편집하고 실행했습니다. x전체 진술이 끝나도 여전히 7입니다.제 책에는 이렇게 적혀 있어요.x증!!

x = x++;

와 동등하다

int tmp = x;
x++;
x = tmp;

x그런데 옛날 할당하고 있어요.x기기자자자자되되되되되


x = x++;
  1. x++ increx오래된 값을 반환합니다.
  2. 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 연산자는 다음과 같이 작동합니다.

  1. 피연산자의 이전 값을 저장합니다.
  2. 오퍼랜드 값을 늘립니다.
  3. 오퍼랜드의 이전 값을 반환합니다.

그래서 그 진술은

int x = 7;
x = x++; 

는 다음과 같이 평가됩니다.

  1. x는 값 7로 초기화됩니다.
  2. post increment 연산자는 반환할 이전 값 x, 즉 7을 저장합니다.
  3. x가 증가하므로 x는 8이 됩니다.
  4. 이전 값인 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에 복사되고 다음으로 값이 복사됩니다.x1씩 증가합니다.

유사하게++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

반응형