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 중국어 웹사이트의 기타 관련 기사를 참조하세요!