C++의 max함수에 관하여

  • hunee
    hunee

    안녕하세요.
    죄송합니다. 몇번 실험을 해봤는데
    또, 이렇게 질문글을 쓰게 됩니다.

    간단히 max함수에 대해서 인데요.
    제가 알기로는 max함수는

    // #define max(a, b) (((a)>(b))?(a):(b))

    이렇게 정의되어 있는 매크로 함수라고 알고 있었는데요.
    문제를 풀다가 max함수 안에 함수를 넣어보게 되는 일이 생겼습니다.

    예를 들어보겠습니다. max(f(1), f(2))
    이 f이라는 함수안에는 어떤 문자열을 화면으로 출력하고
    정수를 리턴하는 함수라고 가정하면
    매크로 함수로 예를 들자면,
    (((f(1)) > (f(2))) ? (f(3)) : (f(4)))
    이렇게 입력될 거란 말이죠.
    그렇다면 우선 앞에 비교를 위해 f(1)을 실행해서 리턴값을 받고
    f(2)를 실행해서 리턴값을 받아서 비교를 하게 되겠죠.
    그렇다면 그 어떤 문자열은 화면에 총 두번 출력 될거구요.
    그 다음 비교가 끝난 다음 그 평가결과에 따라 f(3)이나 f(4)를 호출하겠고
    그 리턴값이 최종적으로 평가가 될것입니다.
    문자열은 한번더 출력되어 최종적으로 3번 출력될것입니다.

    제 경우는 이렇습니다.
    (((f(1)) > (f(2))) ? (f(1)) : (f(2)))
    위와 똑같은 원리로 문자열은 총 3번 출력되어야 할듯합니다만
    이상하게 예상을 벗어나 문자열은 2번 밖에 출력되지 않았습니다.

    f함수가 내부적으로 복잡한 계산을 거친다면 분명 이 삼항연산자에서
    마지막의 평가값을 위해 한번더 함수를 호출하는 것은 불필요한 계산량을
    늘리는 일이겠니 하고 다른 방법을 써야하나 생각했었는데, 예상밖으로
    함수는 두번밖에 호출되지 않았습니다.
    어떻게 된건걸까요? 언어는 c++를 사용했는데 혹시 c때와는 달리 max함수가
    업그레이드 된건가요?

    자세히는 저 f라는 함수가 재귀함수였었습니다.
    재귀함수가 이 max함수안에 각각 인수로 들어간 경우였습니다.
    제가 놓친 부분이 있을까요?

    감사합니다.


    10년 전
3개의 댓글이 있습니다.
  • nosiar
    nosiar

    c++은 std::max함수가 있습니다


    10년 전 link
  • sdhad77
    sdhad77

    c++ 로 (f1()>f2())?f3():f4(); 코드를 돌려봤는데 함수 호출3번 되었습니다.
    문자열도 3번 출력 되었구요.

    디버깅 해보시는게 제일 빠른 해결책이 될 것 같습니다.


    10년 전 link
  • Kureyo
    Kureyo

    std::max를 사용했다면 매크로가 아니라 템플릿을 이용한 구현일듯 하네요


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.