>  기사  >  백엔드 개발  >  C의 \'가장 짜증나는 구문 분석\'은 무엇이며 함수 선언을 어떻게 잘못 유도합니까?

C의 \'가장 짜증나는 구문 분석\'은 무엇이며 함수 선언을 어떻게 잘못 유도합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-24 13:22:12488검색

What's C  's

C의 가장 짜증나는 구문 분석

C에서 코드 조각을 구문 분석하는 방식에 따라 예기치 않은 동작이 발생할 수 있습니다. 한 가지 악명 높은 예는 "가장 짜증나는 구문 분석"으로 알려져 있습니다.

함수 선언의 수수께끼

다음 코드를 고려하세요.

widget w(gadget(), doodad());

언뜻 보면 위젯 유형의 w라는 변수를 선언한 것처럼 보입니다. 그러나 이 코드는 실제로 두 개의 인수를 취하는 w라는 함수를 정의합니다.

인수 붕괴 및 포인터 형변환

함수 선언에서 배열 유형의 인수는 포인터로 붕괴됩니다. 첫 번째 요소로 이동하고 함수 유형의 인수는 함수 포인터로 붕괴됩니다. 따라서 w의 동일한 선언은 다음과 같습니다.

widget w(gadget(*)(), doodad(*)());

이는 함수 w가 첫 번째 인수로 인수를 사용하지 않고 가젯을 반환하는 함수에 대한 포인터를 취함을 의미합니다. 또한 두 번째 인수, 즉 인수를 사용하지 않고 장식물을 반환하는 함수에 대한 포인터를 사용합니다. 함수 자체는 위젯을 반환합니다.

추가적인 복잡성

다음과 같은 경우 "가장 성가신 구문 분석"이 더욱 혼란스러워집니다.

widget w(gadget(x));

x가 이미 변수인 경우 이를 함수 선언으로 어떻게 해석할 수 있나요? 대답은 C에서 변수를 선언할 때 추가 괄호를 사용할 수 있다는 사실에 있습니다. 따라서 가젯 x; 및 가젯(x); 둘 다 x라는 동일한 변수를 선언합니다. 따라서 위의 코드는 x라는 가젯 유형의 첫 번째 인수를 취하고 위젯을 반환하는 함수의 선언입니다.

위 내용은 C의 \'가장 짜증나는 구문 분석\'은 무엇이며 함수 선언을 어떻게 잘못 유도합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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