전++와 후++로 인한 혈액사건~~!!

8392 단어
먼저 기이한 코드를 보십시오.
int main(void)
{
int x = 4; int y; y = (x++); printf("hello world. y = %d.
", y);

  x = 4; y = (x++)+(x++); printf("hello world. y = %d.
", y);

   x = 4; y = (x++)+(x++)+(x++); printf("hello world. y = %d.
", y);

   x = 4; y = (x++)+(x++)+(x++)+(x++); printf("hello world. y = %d.
", y);

  x = 4; y = (++x); printf("hello world. y = %d.
", y);

  x = 4; y = (++x)+(++x); printf("hello world. y = %d.
", y);
   x = 4; y = (++x)+(++x)+(++x); printf("hello world. y = %d.
", y);
 
  x = 4; y = (++x)+(++x)+(++x)+(++x); printf("hello world. y = %d.
", y);
return 0;
     
}

 
VS2012 (윈도우즈 실행 환경) 의 테스트 결과는 다음과 같습니다.
\\ ++

y = 4.

y = 8.   //4+4

y = 12. //4+4+4

y = 16. //4+4+4+4

\\ ++

y = 5.   

y = 12. //6+6

y = 21. //7+7+7

y = 32. //8+8+8+8

 
  
Ubuntu에서 테스트한 결과는 다음과 같습니다.
// ++

y = 4.

y = 9.   //4+5

y =15.  //4+5+6

y = 22. //4+5+6+7

// ++

y = 5.

y = 12. //6+6

y = 19. //6+6+7

y = 27. //6+6+7+8

 
윈도우즈에 대한 테스트 결과는 모두 비교적 이해하기 쉽다.
1. 후++의 경우 값을 부여하기 전에 x는 점차적으로 증가하지 않기 때문에 매번 x++가 하나 더 있으면 4가 더 늘어나는 것에 불과하다.
2. 전++의 경우 값을 부여하기 전에 x가 점차적으로 증가하기 때문에 매번 x가 대응하는 메모리의 값이 1씩 높아지고 마지막에 추가된다.
그래서 6*2 7*3 8*4의 결과가 나왔다.
 
linux의 테스트 결과에 대해 이해하기가 쉽지 않다.
1. 뒷++에 있어서 두 번째는 윈도우즈의 결과와 다르다. 이것은 linux가 중간 변수를 만드는 방식을 사용했기 때문이다.
예: y = (x++) + (x++);여러 단계로 나뉘어짐: 1)tmp=x;  x = x + 1;2) tmp1 = x;  x = x + 1;  3)y  = tmp + tmp1;
1) 중tem은 4와 같고 x가 증가한다.2) tmp1은 4를 기다렸고 x도 증가했다.3) 결과는 4+5=9
(x++)가 세 개로 늘어날 때도 마찬가지로 분석하지만 중간 변수 tmp2가 하나 더 있을 뿐이다.
2. 앞의++에 대해 세 번째는 윈도우즈와 결과가 다르고 중간 변수가 생겼기 때문이다.
예를 들어 y=(++x)+(++x)+(++x);여러 단계로 나뉘어졌습니다.
1)tmp = (++x)+(++x);  2)y = tmp  + (++x);
그리하여 y = 6+6+7
다시 예를 들어 y=(++x)+(++x)+(++x);여러 단계로 나뉘어졌습니다.
1)tmp = (++x)+(++x);  2)tmp1 = tmp  + (++x);  3)y =  tmp1 + (++x);
그리하여 y = 6+6+7+8
여기서 유일하게 곤혹스러울 수 있는 것은 왜 (++x) + (++x) 중간에 중간 변수가 생기지 않았는가?(x++)+(x++)는 중간 변수가 생겼나요?
내 추측에 의하면 앞의++는 먼저 점차적으로 증가하고 나중에 값을 부여해야 하기 때문에 바로 x=x+1이기 때문에 중간 변수의 발생도 없고 가장 앞의
두 개의 (++x) 와 '+' 작용은 하나의 표현식을 생성합니다. (++x) + (++x) 이 표현식은 중간 변수와 뒤에 있는 표현식에 순서대로 값을 부여합니다.
요약:
1. vs의 컴파일러는 한 문장에 중간 변수가 생기지 않았고 ubuntu에는 중간 변수가 생기기 때문이다.
그래서 뒤에++일 때 ubuntu는 x의 메모리 공간에 대해 더 많은 조작을 하고 앞에++일 때 vs는 x의 메모리 공간에 대해 더 많은 조작을 한다.결과의 불일치를 초래했다.
2. 첫 번째 점을 알게 된 후에 우리는 한 문장에서 한 변수에 대해 여러 번 조작하지 않도록 주의해야 한다. 왜냐하면 컴파일러가 이 문장에 몇 개의 중간 변수를 만들어 혈안을 일으키는지 모르기 때문이다~~

좋은 웹페이지 즐겨찾기