an0520a   2년 전

혹시 코드가 진짜 맞는데 계속 55%에서 틀린다 하시는 분들은 abs 함수의 반환값을 확인해보시기 바랍니다...

문제 풀면서 알게된 사실인데, 깜박하고 std를 안붙이면 오류가 나는게 아니라, int형 abs함수가 호출되더라구요. 따로 cstdlib을 추가한것도 아닌데도...

algorithm에 int형 abs함수도 있는줄은 첨알았으...

이와 관련된 반례케이스도 추가합니다.

8
1000000000 1000000000 1000000000 1000000000 1000000000 999999999 1000000000 1000000000

정답 : 999999999 1000000000 1000000000

ckdgus2482   2년 전

혹시 c++98이전 버전으로 제출하셨나요? c++11이후부터는 전역 스코프에 있는 abs도 int, long, long int 타입의 파라미터에 대해 오버로딩되어있습니다.

따라서 파라미터가 long long 타입이면 int 파라미터보다 long long 파라미터가 더 잘 부합하기 때문에 long long 버전의 abs함수가 호출됩니다.


an0520a   2년 전

아뇨 C++11이였습니다. 그런데, 확인해보니까. cstdlib을 추가하지 않았음에도, cstdlib에서 abs함수가 호출되고 있네요... 뭐지

http://boj.kr/4e3ee56aefcf487d...

ckdgus2482   2년 전

#include <cstdio>

#include <cstdlib>

int main() {

    auto ret = abs(-123456789123456ll);

    printf("%lld", ret);

}
이렇게 테스트해봤는데 문제 없이 잘 나옵니다

an0520a   2년 전

g++ 컴파일러 버전 차이인것 같아요. 저는 오버플로우가 발생하네요.

preview

참고)

현재, 제 g++ 버전은 다음과 같습니다.

g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ckdgus2482   2년 전

그런가보네요... 항상 std에 있는 버전만 써서 몰랐네요

레퍼런스 페이지를 다시 보니 오버로딩 버전 명시된게 std에 있는 함수인 것 같습니다.

그냥 전역 스코프에 있는 abs는 비표준 구현인가봐요.

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