hj650117   5년 전

아래의 코드와 같이 M개의 나무에 대한 정보를 받을 때

for (i = 1; i <= M; i++) 

{

          scanf("%d%d%d", &x, &y, &z);

          q[++t].x = x, q[t].y = y, q[t].age = z;

}

라고 작성한 뒤 제출하면 정답이 뜨는데

for(i=1; i<=M; i++) 

        scanf("%d%d%d", &q[++t].x, &q[t].y, &q[t].age);

라고 작성하면 오답이 나옵니다.

scanf사용 할때 ++연산순서가 바뀌거나 이런게 있나요?

이유 좀 알려주세요

dyk777   5년 전

제 기억에 따르면 scanf()를 여러개의 인자를 써서 입력 받을 때, 뒤에서부터 차례로 입력받습니다.

즉, 해당 코드를 아래와 같이 하면 (아마도) ac일 것 같네요.

gaelim   5년 전

제 생각엔 Undefined behavior 문제 때문인 것 같습니다.

아래 링크를 참조해보세요. 

https://stackoverflow.com/ques...

amatuer789   5년 전

제 생각도 뒤에서 입력인 것 같습니다. 

함수 같은 경우도 void f(int a, int b, int c) 일지라도, 실제로는 c->b->a 순으로, 스택에 파라미터를 쌓고 함수 호출로 이어집니다.

scanf도 함수이기 때문에, 내부적으로 함수로 넘어갈 때 인자의 순서는 거꾸로 입력되지 않을까 싶습니다.

하단 코드에 

입력 :  1 2,

출력 : 2 1 0 0 0 

A[0]의 주소가 먼저 전달되고, A[1]의 주소가 나중에 전달되서 가능하지 않을까 하는...

hj650117   5년 전

제 코드에

scanf("%d%d%d", &q[t].x, &q[t].y, &q[++t].age);

로 바꾸니까 런타임 에러가 뜨네요;;

비주얼로는 뒤에서 받는게 확인이 되긴하는데,,,

dyk777   5년 전

그렇다면 결국 위에서 gaelim님께서 지적하신 대로 Undefined behavior문제겠군요. 실행 환경에 따라 결과가 달라져버린다면 그럴 확률이 높겠네요.

djm03178   5년 전

저런 경우의 동작의 순서는 undefined behavior이기 때문에 사용하면 안 됩니다. 증가한다고 해놓고 실제로는 그 자리에서 즉시 증가가 안 되고 모든 연산이 끝난 후 증가할 수도 있습니다. 왼쪽부터 실행될 수도 있고 오른쪽부터 실행될 수도 있고 가운데부터 실행될 수도 있고, 엉뚱하게 100이 더해진 수를 사용하거나 컴퓨터가 갑자기 폭발을 일으켜도 프로그래머는 할 말이 전혀 없는 것이 undefined behavior입니다. 

hj650117   5년 전

답변 주신분들 모두 감사합니다~ 새로운걸 알게 됐어요!ㅎㅎ

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