전++와 후++로 인한 혈액사건~~!!
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. 첫 번째 점을 알게 된 후에 우리는 한 문장에서 한 변수에 대해 여러 번 조작하지 않도록 주의해야 한다. 왜냐하면 컴파일러가 이 문장에 몇 개의 중간 변수를 만들어 혈안을 일으키는지 모르기 때문이다~~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.