Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[4787] Re:포인터 연산에 대한 질문입니다.
진수.네모 [miman101] 1247 읽음    2004-11-23 21:51
안녕하세요 뚱뚱해입니다.

음... 별로 좋은 예제가 아닌듯합니다...

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 윈도우버젼을 쓰고 있습니다.
: 계속되는 초보적인 질문에 답변해주시는 분들 정말 감사합니다~~
: 공부 열심히 할게여~~

+ -

관련 글 리스트
4786 포인터 연산에 대한 질문입니다. 한성현 1204 2004/11/23
4787     Re:포인터 연산에 대한 질문입니다. 진수.네모 1247 2004/11/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.