안녕하세요 뚱뚱해입니다.
음... 별로 좋은 예제가 아닌듯합니다...
int i=3,j=7,*p=&i,*q=&j;
j += *q -= *p;
printf("%d %d %d\n",i,j,*q);
printf("%d %d %d\n",q != &i, *p + *q, **&q);
cout << *p << " " << *q << endl; // 이부분을 추가 하여 *p 와 *q가 어떤값을 가지고 있는지 파악
printf("%d %d\n",i + *p / *q, ++*p + *q++);
이렇게 해놓고 보변 *p = 3, *q = 8 의 값을 가지고 있답니다.
따라서 i + *p / * q = 3 이 나와야만 합니다..
하지만... 세번째 printf 문을 보면
printf("%d %d\n",i + *p / *q, ++*p + *q++);
|
이 부분이 있죠...
책에서 얼핏 읽은 기억이 있는데 뒤에서 앞으로 계산하면서 온다 라고 했던거 같네요...
확인 하기 위해서 다음과 같이 수정했답니다.
printf("%d %d %d %d\n",i + *p / *q,*p,*q, ++*p + *q++);
그럼 i+*p/*q = 5 , *p = 4, *q = 4 , ++*p + *q++ = 12 가 나옵니다.
즉,,,, 확인 결과 뒤에서 부터 계산하여 앞으로 오네요...
그런데 이상한 점은 *q 가 4라는 점입니다...
아무래도 ++ 과 * 의 연산자 우선순위에 따른 문제 인거 같더군요...
그래서 아래와 같이 수정하고 해보았답니다.
printf("%d %d %d %d\n",i + *p / *q,*p,*q, ++(*p) + (*q)++);
예상한데로 *q 는 9 로 나왔습니다...
그렇다면 printf("%d %d %d %d\n",i + *p / *q,*p,*q, ++*p + *q++);
에서 *q++ 은 어떻게 된걸까요... 아마도 포인트 연산이 된거 같습니다.
그럼 엉뚱한 값을 가져야 정상인데 이게 우연 찮게도...
p와 q가 같아져 버립니다.... 아마도 stack 에 넣어진 순서에 따른 현상 같습니다.
정말 우연찮게.... 컴파일 되서 값이 제대로 나온 예제 같아요...
이때 i 를 변경 시키면 *p 와 *q 값이 동시에 변합니다. 주소를 확인해도 같음을 알 수있죠...
따라서 i + *p / *q 는 i 와 *p 와 *q 가 모두 4 이므로 5가 나옵니다.
쩝.... 포인터 공부하는 이런식으로 꼬아 놓은 예제는 나로서는 비추천입니다...
: #include <stdio.h>
: void main()
: {
: int i=3,j=7,*p=&i,*q=&j;
: j += *q -= *p;
: printf("%d %d %d\n",i,j,*q);
: printf("%d %d %d\n",q != &i, *p + *q, **&q);
: printf("%d %d\n",i + *p / *q, ++*p + *q++);
: }
:
: 위의 3번째 printf() 에서
: i + *p / *q 의 결과값이
: 책에는 0 이라 나와있고
: 컴파일 하면 5 라고 나옵니다.
: 제생각에는 i=3 이고 *p 는 3 이고 *q 는 8 이니까
: 3/8 하면 0. 이 나오니까 3 + 0. 은 3 아닌가여?
:
: 혹시 8/3해서 2. 이 되니까 3 + 2. 해서 5 가 나오는건가여?
: 제가 / 연산자를 햇갈리고 있나여?
: 아닌거 같은데 왜 5가 나오는지 궁금합니다.
: 전 터보씨++3.1 윈도우버젼을 쓰고 있습니다.
: 계속되는 초보적인 질문에 답변해주시는 분들 정말 감사합니다~~
: 공부 열심히 할게여~~
|