none
[C언어] printf와 함수에 관한 질문입니다. RRS feed

  • 질문

  • VS 2017, C언어로 다음 코드를 실행해 보았습니다.


    #include<stdio.h>

    int func(int *i);


    int main()

    {

        int a = 10;

        printf("%d %d %d", a, func(&a), a);

    }


    int func(int *i)

    {

       *i +=1;

       return *i;

    }


    저는 실행창에서 "10 11 11"을 기대하고 작성했습니다만 실제로 나온 결과는 "11 11 10"이었습니다.

    왼쪽에서 오른쪽으로 순서대로 처리되지 않는 이유가 무엇인지 궁금합니다.

    printf 구문 내에 함수가 처리되는 우선순위 같은 게 있는 걸까요? 

    2018년 5월 23일 수요일 오전 7:49

답변

  • 같은 C 코드라도 컴파일러의 calling convention에 따라서 처리하는 순서가 다른 걸로 알고 있습니다. 즉, 이런 저런 컴파일러들이 규약을 따라겠지만 그 안에서도 특정되지 않은 동작이죠.

    정확히 어떤 것이다라고 말씀은 못 드리겠습니다만, 아마도 리눅스나 Windows 기반의 어떤 컴파일러에서는 생각하시는 것처럼 "10 11 11"이 나올 수도 있는 반면, 지금 사용하시는 VS2017의 C 컴파일러에서는 파라미터들을 우측에서 좌측으로 처리해서 "11 11 10"으로 결과가 나오는 것으로 생각하시면 됩니다.

    • 답변으로 표시됨 NAELC 2018년 5월 23일 수요일 오후 1:27
    2018년 5월 23일 수요일 오후 12:36

모든 응답

  • 같은 C 코드라도 컴파일러의 calling convention에 따라서 처리하는 순서가 다른 걸로 알고 있습니다. 즉, 이런 저런 컴파일러들이 규약을 따라겠지만 그 안에서도 특정되지 않은 동작이죠.

    정확히 어떤 것이다라고 말씀은 못 드리겠습니다만, 아마도 리눅스나 Windows 기반의 어떤 컴파일러에서는 생각하시는 것처럼 "10 11 11"이 나올 수도 있는 반면, 지금 사용하시는 VS2017의 C 컴파일러에서는 파라미터들을 우측에서 좌측으로 처리해서 "11 11 10"으로 결과가 나오는 것으로 생각하시면 됩니다.

    • 답변으로 표시됨 NAELC 2018년 5월 23일 수요일 오후 1:27
    2018년 5월 23일 수요일 오후 12:36
  • 이 답변을 기반으로 다시 검색해보니 말씀하신 바와 같은 글을 발견할 수 있었습니다.

    https://kldp.org/node/114590

    결론은 인자의 평가순서를 알 수 없으니 왠만하면 한 가지 동작만 일어나게 작성하라는거네요.

    도움이 많이 되었습니다. 감사합니다.

    2018년 5월 23일 수요일 오후 1:27