함수 이름이 연산자 주소가 있는 함수 포인터와 동일한 이유는 무엇입니까?
C 프로그래밍에서 함수 이름을 함수 포인터로 사용 이는 주소 연산자(&)를 함수 이름에 적용하는 것과 동일합니다. 배열과 같은 다른 언어 요소와의 이러한 겉보기 불일치에는 특정한 근거가 있습니다.
함수 이름 동등성의 이론적 근거
ANSI C90 이론적 근거 문서에 따르면 동등성은 함수지정자(함수명)와 함수포인터 사이에 기호를 도입하여 편의성을 높였습니다. 두 표기법을 모두 허용함으로써 언어는 패키지 구조에서 멤버 함수를 호출하는 간단한 방법을 제공합니다. 예를 들어:
graphics.open(file) // Equivalent to (*graphics.open)(file)
함수 지정자의 호기심
이 동등성은 독특하지만 유효한 구문 형식으로 이어집니다.
( &f)(); f(); (*f)(); (**f)(); (***f)(); pf(); (*pf)(); (**pf)(); (***pf)();
위원회는 다음과 같이 추론했습니다. (f)()와 같은 형식은 금지하고 a(for int a[])는 불필요하고 불편했을 것입니다.
매개변수 및 반환 유형의 예외
흥미롭게도 함수 유형은 암시적으로 자신을 가리키는 포인터로 변환될 수 있습니다. 매개변수로(예: void g(FunctionType)). 그러나 반환 유형(예: FunctionType h();)으로 사용되는 경우 포인터로 변환할 수 없습니다. 이러한 구별을 통해 함수 유형 호환성 문제를 피할 수 있습니다.
위 내용은 함수 이름이 C에서 연산자 주소를 갖는 함수 포인터와 동일한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!