Programing

C ++에서 변수를 선언 할 때 변수 이름을 괄호로 묶을 수있는 이유는 무엇입니까?

lottogame 2020. 10. 6. 07:42
반응형

C ++에서 변수를 선언 할 때 변수 이름을 괄호로 묶을 수있는 이유는 무엇입니까?


예를 들어 다음과 같은 선언이 있습니다.

int (x) = 0;

또는 그것도 :

int (((x))) = 0;

내 코드에서 다음과 비슷한 조각이 있었기 때문에 이것을 우연히 발견했습니다.

struct B
{
};

struct C
{
  C (B *) {}
  void f () {};
};

int main()
{
  B *y;
  C (y);
}

분명히 나는 C소멸자에서 유용한 것을 할 객체 만들고 싶었습니다 . 그러나 컴파일러는 유형 C (y);이있는 변수의 선언으로 처리 하므로 재정의에 대한 오류를 인쇄합니다 . 재미있는 것은 내가로 작성하는 경우이다 또는 무언가로 같이 가 의도 한대로 컴파일. 가장 현대적인 해결 방법은 물론 생성자 호출 에 사용하는 것 입니다.yCyC (y).f ()C (static_cast<B*> (y)){}

그래서 내가 그 후에 알아 냈 듯이 변수를 같은 int (x) = 0;또는 심지어 선언하는 것이 가능 int (((x))) = 0;하지만 실제로 이와 같은 선언을 사용하는 사람을 본 적이 없습니다. 그래서 저는 관심이 있습니다. 현재로서는 악명 높은 "가장 성가신 구문 분석"과 유사한 경우 만 생성하고 유용한 정보를 추가하지 않기 때문에 그러한 가능성의 목적은 무엇입니까?


그룹화.

특정 예로서, 다음과 같은 함수 유형의 변수를 선언 할 수 있습니다.

int f(int);

자, 그런 것에 대한 포인터를 어떻게 선언 하시겠습니까?

int *f(int);

아니, 작동하지 않습니다! 이것은를 반환하는 함수로 해석됩니다 int*. 올바른 방법으로 구문 분석하려면 괄호를 추가해야합니다.

int (*f)(int);

배열도 마찬가지입니다.

int *x[5];   // array of five int*
int (*x)[5]; // pointer to array of five int

구문상의 관점에서 볼 때 선언은 항상 다음과 같이 보이기 때문에 일반적으로 이러한 선언에 괄호를 사용할 수 있습니다.

<front type> <specification>;

예를 들어, 다음 선언에서 :

int* p[2];

"전면 유형"은 int(아님 int*)이고 "사양"은 * p[2]입니다.

규칙은 "규격"부분에 필요한만큼의 괄호를 사용할 수 있다는 것입니다. 괄호는 때때로 명확하게하기 위해 불가피하기 때문입니다. 예를 들면 :

int* p[2]; // array of 2 pointers to int; same as int (*p[2]);
int (*p)[2]; // pointer to an array of 2 ints

배열에 대한 포인터는 드물지만 함수에 대한 포인터와 동일한 상황입니다.

int (*func(int)); // declares a function returning int*
int (*func)(int); // declares a pointer to function returning int

이것은 귀하의 질문에 대한 직접적인 대답입니다. 질문이과 같은 진술에 관한 C(y)것이라면 :

  • 전체 표현식을 괄호로 묶으 (C(y))면 원하는 것을 얻을 수 있습니다.
  • This statement does nothing but creating a temporary object, which ceases to living after this instruction ends (I hope this is what you intended to do).

참고URL : https://stackoverflow.com/questions/29675601/why-does-c-allow-us-to-surround-the-variable-name-in-parentheses-when-declarin

반응형