가장 음의 정수 값에 대한 모호한 함수 오버로드
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!