>백엔드 개발 >C++ >C의 \'가장 짜증나는 구문 분석\'이 변수 선언을 함수 선언으로 잘못 해석하는 이유는 무엇입니까?

C의 \'가장 짜증나는 구문 분석\'이 변수 선언을 함수 선언으로 잘못 해석하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-01 13:12:12302검색

Why Does C  's

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

C에서 악명 높은 "가장 짜증나는 구문 분석" 현상은 겉보기에 무해해 보이는 명령문이 해석될 수 있을 때 발생합니다. 함수 선언이나 변수 선언으로. 이로 인해 예상치 못한 동작과 디버그하기 어려운 오류가 발생할 수 있습니다.

한 가지 전형적인 예는 코드 조각입니다.

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

얼핏 보면 이는 코드 조각에 대한 변수 선언으로 보입니다. 괄호로 묶인 초기화 프로그램이 포함된 w라는 위젯. 그러나 면밀히 조사해 보면 Gadget() 및 doodad()가 함수 호출이며 명령문을 함수 선언으로 만든다는 것을 알 수 있습니다.

배열 유형의 함수 인수가 첫 번째 요소에 대한 포인터로 바뀌기 때문에 모호성이 발생합니다. 함수 유형의 함수 인수는 함수 포인터로 붕괴됩니다. 이는 위 함수의 시그니처가 실제로 다음과 같다는 것을 의미합니다.

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

즉, 두 개의 함수 포인터를 인수로 사용하고 위젯을 반환합니다.

변수가 있는 경우 훨씬 더 복잡한 경우가 발생합니다. 관련되어 있습니다:

widget w(gadget(x));

x는 변수이므로 이를 함수 선언으로 해석하는 것은 불가능해 보입니다. 그러나 C에서는 변수 선언에 추가 괄호를 허용합니다. 따라서 두 가젯 x; 및 가젯(x); 동일한 변수 x를 선언합니다.

따라서 위 코드는 x라는 가젯 유형의 단일 인수를 취하고 위젯을 반환하는 함수 선언으로 구문 분석될 수 있습니다. 이는 이러한 미묘한 함정을 피하기 위해 C 구문의 복잡성을 이해하는 것이 중요함을 보여줍니다.

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

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