CHULMING   4년 전

for문을 쓰기 귀찮아서 while문을 쓰던 도중 제 생각이랑 동작 과정이 다른 것이 발견되어

궁금해서 질문합니다.

for문 의 출력을 보면
1 1
2 2
3 3
4 4 와 같이 의도한대로 출력됩니다.

하지만 while 문의 경우 앞의 수가 인덱스 1을 앞서서 출력하더군요
2 1
3 2
4 3
(쓰레기 값) 4 처럼 나오더군요

증감 연산자 부분에서 문제가 생기는 것 같은데 설명 해주실 분 계신가요..!?

djm03178   4년 전

저건 아마 표준상에서 동작은 정의되지 않을 듯합니다. 아마 ccm님이 사용하시는 환경에서는 이를 이렇게 처리하는 것으로 보입니다.

1. 전달 인자들 중 오른쪽부터 처리

2. 후위 증감 연산자는 그 자리에서 바로 증가 (식의 값은 변경 전의 것을 사용하지만)

그래서 arr2는 st번째 인덱스를 접근하지만, 그 즉시 st가 증가된 후에 arr1[st]를 처리하기 때문에 arr1은 arr2보다 하나 큰 인덱스에 접근하게 되는 거겠죠.

참고로, VS 2013을 쓰는 제 환경에서는 둘 다 1 1 - 2 2 - 3 3 - 4 4 로 나옵니다.

robustflame   4년 전

함수 호출 규약에 따라 다를 수 있지만, 대부분 함수의 파라미터 전달 순서는 오른쪽부터 이루어집니다.

즉, while 문에서 printf 함수를 호출할 때 arr2[st++], arr1[st], "%d %d\n" 순으로 전달(스택에 push)된다고 생각하시면 됩니다.

printf("%d %d\n", arr1[st++], arr2[st]); <- 이렇게 바꾸시면 for 문과 같이 작동하시겁니다.

자세한 것은 함수 호출 규약 (Calling Convention)에 대해서 알아보시면 됩니다.



CHULMING   4년 전

@djm03178

@robustflame

아~ 설명 들으니 이해가 가네요.

두분 다 감사합니다! 


yukariko   4년 전

@robustflame 함수에 전달되는 파라미터의 순서는 그럴 수 있으나, 파라미터의 연산까지 순서가 정해진것은 아닙니다.
미리 연산이 이루어지고 나중에 전달될 수 도 있죠. 이것은 함수 호출 규약하고는 다른 영역입니다.
따라서 undefined behavior 로 보는것이 맞습니다. 

댓글을 작성하려면 로그인해야 합니다.