>백엔드 개발 >C++ >C에서 가장 짜증나는 구문 분석은 무엇이며 `A a(A());`를 함수 선언으로 해석하는 이유는 무엇입니까?

C에서 가장 짜증나는 구문 분석은 무엇이며 `A a(A());`를 함수 선언으로 해석하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-21 05:40:09900검색

What is the C   Most Vexing Parse and Why Does It Interpret `A a(A());` as a Function Declaration?

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

C 구문의 미로 같은 세계에서 한 가지 수수께끼의 수수께끼가 눈에 띕니다. Vexing Parse(MVP). 이러한 구문적 특이성은 프로그래머에게 도전 과제를 제기하여 많은 사람들을 당황하게 만듭니다.

MVP의 핵심은 특정 구문의 모호한 해석에 있습니다.

A a( A() );

이 당황스러운 줄은 다음으로 해석될 수 있습니다. 두 가지 상충되는 방식:

  1. 변수 정의: 클래스 'A'의 변수 'a'가 정의되어 클래스 'A'의 익명 인스턴스를 값으로 사용합니다.
  2. 함수 선언: 함수 'a '가 선언되어 'A' 유형의 객체를 반환하고 'A'를 반환하고 아무 것도 취하지 않는 함수인 명명되지 않은 단일 인수를 취합니다. 입력.

놀랍게도 첫 번째 해석이 정확할 것이라는 프로그래머의 일반적인 기대에도 불구하고 C 표준은 두 번째 해석을 요구합니다. 이로 인해 많은 사람들이 왜 그렇게 예상치 못한, 혼란스러울 수 있는 선택을 했는지 궁금해하며 머리를 긁적입니다.

MVP의 근거를 이해하기 위해 MVP가 존재하지 않는 가상 시나리오를 고려해 보겠습니다. 이 대체 현실에서 C에서 함수는 어떻게 선언됩니까?

A foo();

불행히도 이 구문을 사용하면 메서드 선언이 아닌 변수 정의가 생성됩니다. 함수 선언을 수용하려면 새로운 키워드나 어색한 구문이 필요합니다.

이러한 복잡성을 피하기 위해 C 표준은 더 간단한 규칙을 선택했습니다. "선언으로 해석될 수 있는 모든 것은 선언으로 해석됩니다. 선언." 여기에는 변수 정의와 함수 선언이 모두 포함됩니다. 따라서 구문

A a;

은 변수를 정의하고

A a();

함수는 선언합니다.

이 규칙을 채택하면 구문의 일관성이 보장되므로 특별한 경우. 이는 처음에는 프로그래머를 혼란스럽게 할 수 있지만 궁극적으로는 언어의 명확성과 일관성을 향상시킵니다.

위 내용은 C에서 가장 짜증나는 구문 분석은 무엇이며 `A a(A());`를 함수 선언으로 해석하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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