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

C/C++ Q/A
[2261] Re: 절대로 이런 코드는 사용하지 마세요!!
김백일.cedar [cedar] 1038 읽음    2003-04-04 13:53
김학래 님이 쓰신 글 :
: #include<stdio.h>
:
: main()
: {
:     int i, j, m, n;
:     i = j = m = n = 10;
:     printf("i = %d, i++ = %d, ++i = %d\n", i, i++, ++i);
:     printf("j = %d, j+1 = %d, j+2 = %d\n", j, j+1, j+2);
:     printf("m = %d, m-- = %d, --m = %d\n", m, m--, --m);
:     printf("n = %d, n-1 = %d, n-2 = %d\n", n, n-1, n-2);
: }
:
: 여기에서 결과값이
:
: 첫번째 12  11  11
: 두번째 10  11  12
: 세번째 8   9   9
: 네번째 10  9   8
:
: 이렇게 나오는데요.....첫번째랑 세번째가 왜 저렇게 나오는지
:
: 자세히 설명좀 해주세요......
:
: 도저히 이해가 안되네요 ㅜㅜ

함수 인자의 호출 순서는 ANSI/ISO C 표준에 정의되어 있지 않습니다.
표준에 정의되어 있지 않다는 것은 컴파일러에 따라 다르다는 겁니다.
그러므로 호환성을 위해서 위와 같이 동일한 함수 인자에 동일한 변수를 넘길 때 ++와 -- 연산자를 사용하는 것을 삼가하세요!!

참고로 Borland C++Builder에서는 __cdecl, __fastcall, __pascal, __stdcall의 네가지 호출 순서를 지원합니다. 디폴트는 __cdecl로서 오른쪽 파라미터부터 런타임 스택에 푸쉬하는 것으로 되어 있습니다. 이렇게 호출 순서가 다르면 다른 컴파일러로 만든 라이브러리(.lib, .dll)을 링크할 때 문제가 생깁니다. 보통 DLL의 표준 호출 순서는 __stdcall 입니다.

+ -

관련 글 리스트
2258 질문입니다......자세한 설명 부탁드립니다..... 김학래 1065 2003/04/04
2261     Re: 절대로 이런 코드는 사용하지 마세요!! 김백일.cedar 1038 2003/04/04
2260     Re:질문입니다......자세한 설명 부탁드립니다..... 불사새 1110 2003/04/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.