플랫폼에 따라 출력 결과가 ^^;;
글쓴이: alwaysrainy / 작성시간: 목, 2003/10/09 - 9:05오후
#include <stdio.h> void func(int a, int b); int main() { int a = 0; //func(++a, ++a); func(++a, ++a); } void func(int a, int b) { printf("%d\n", a); printf("%d\n", b); }
위의 코드를 두 플랫폼에서 실행시켰을때 x86 플랫폼에서는
2, 1이라는 실행결과가 sparc 플랫폼에서는 1, 2라는 실행결과가
출력되었습니다. 이는 단순히 컴파일가 각각의 플랫폼에 맞는 어셈
코드로 변환시에 생기는 차이인가요? 아니면.. 제가 모르는 다른 이유라도..?
Forums:
Re: 플랫폼에 따라 출력 결과가 ^^;;
인자를 평가하는 순서가 없기 때문입니다. 굳이 CPU의 문제가 아니더라도 컴파일러가 바뀌어도 발생할수 있는 문제입니다. 규칙이 없는 부분에 대해서는 만든 사람이 나름대로 정하거나 그 환경에서 비용이 적은 것으로 정하기 때문입니다.
lvalue가 같은 데이터가 2개 이상 함수 호출에 쓰인다면 부작용이 있는 행위를 절대로 해선 안된다고 코딩 컨벤션을 정하는게 이로우실 것 같습니다.
비슷한 것으로는 A && B 나 A || B와 같이 구문에서는 단락검사의 위험이 있으니 B에서는 부작용이 있는 행위를 하는 것도 피하시는 것이 좋겠지요 :-)
PS: 부작용이란 말의 어감이 정말 이상하네요. 뭔가 엉터리나 잘못한 것 같은 느낌이 드니말입니다. side effect를 대신 할 말이 없을까요?
- 죠커's blog / HanIRC:#CN
Re: 플랫폼에 따라 출력 결과가 ^^;;
'우수리' 효과 :-)
지어낸게 아니고, 어디선가 저렇게 번역한 걸 본 기억이 나서 덧붙여 봅니다.
제 눈엔 꽤 그럴듯해 보였거든요.
The good is the enemy of the best.
여러 C 책에 나오겠지만, 저런 코드는 짜면 안된다고 배웠습니다.
여러 C 책에 나오겠지만, 저런 코드는 짜면 안된다고 배웠습니다.
여기서 a=0 이라면, b는 얼마일까요? 0일까요 1일까요?
이건 플랫폼에 따라 지맘대로 된다고 배웠습니다.
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
제 생각입니다만....컴파일러 마음에 따라 변할것 같군요.왠지 머
제 생각입니다만....
컴파일러 마음에 따라 변할것 같군요.
왠지 머신과는 관계없을듯....
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
댓글 달기