>  기사  >  백엔드 개발  >  C의 오버로드된 함수에 가장 큰 음의 정수 값을 전달하면 값을 직접 인쇄하는 것이 올바르게 작동함에도 불구하고 모호성 오류가 발생하는 이유는 무엇입니까?

C의 오버로드된 함수에 가장 큰 음의 정수 값을 전달하면 값을 직접 인쇄하는 것이 올바르게 작동함에도 불구하고 모호성 오류가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 21:24:02788검색

Why does passing the most negative integer value to an overloaded function in C   lead to an ambiguity error, even though printing the value directly works correctly?

가장 음의 정수 값에 대한 모호한 함수 오버로드

C에서 함수 오버로드를 사용하면 이름은 같지만 매개 변수가 다른 여러 함수를 사용할 수 있습니다. 그러나 컴파일러가 주어진 인수를 기반으로 호출할 오버로드된 함수를 결정할 수 없는 경우 모호성이 발생합니다. 이 문제는 정수 유형으로 작업할 때, 특히 가장 큰 음수 값을 처리할 때 발생할 수 있습니다.

다음 코드 조각을 고려하세요.

<code class="c++">void display(int a)
{
    cout << "int" << endl;
}

void display(unsigned a)
{
    cout << "unsigned" << endl;
}

int main()
{
    int i = -2147483648;
    cout << i << endl; //will display -2147483648
    display(-2147483648);
}

함수 오버로딩에 대한 우리의 이해에 따르면 모든 값은 정수 범위(이 경우 4바이트) 내에서 display(int) 함수를 호출해야 합니다. 이 범위를 벗어나는 값은 모호해집니다. 그러나 이 코드를 컴파일하면 다음 오류가 발생합니다.

call of overloaded `display(long int)` is ambiguous

이 오류는 가장 큰 음의 정수 값(-2147483648)을 표시 함수에 전달할 때 발생합니다. 이상하게도 동일한 값을 직접 인쇄하면(6행에 표시) 올바른 결과가 생성됩니다: -2147483648.

미묘함: C의 음수 리터럴 부족

The 이 동작을 이해하는 열쇠는 C에 부정적인 리터럴이 없다는 것입니다. C의 모든 정수 리터럴은 기본적으로 부호 없는 것으로 간주됩니다. 즉, 부호 접두사(- 또는 )가 없음을 의미합니다. 결과적으로 -2147483648은 실제로 -1 *(2147483648)로 처리됩니다.

오버로드된 함수에 대한 의미

2147483648이 정수 범위(4바이트)를 초과하므로 ), 긴 정수로 승격됩니다. 이는 컴파일러가 기존 display(int) 오버로드와 충돌하는 display(long int) 함수를 호출하려고 시도한다는 것을 의미합니다. 따라서 모호성이 발생합니다.

해상도

이러한 모호성을 피하려면 std::numeric_limits 클래스를 사용하여 유형별 최소값과 최대값을 얻는 것이 좋습니다. :

<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>

위 내용은 C의 오버로드된 함수에 가장 큰 음의 정수 값을 전달하면 값을 직접 인쇄하는 것이 올바르게 작동함에도 불구하고 모호성 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.