배경
C의 변수 선언문 은 변수 이름 , 기본 유형 및 유형 수정 자의 세 부분으로 구성됩니다 .
세 가지 유형의 수정자가 있습니다.
- 포인터
*
(접두사) - 배열
[N]
(접두사) - 기능
()
(접두사)- 괄호 안에 함수 인수 목록을 지정할 수 있지만,이 문제를 해결하기 위해 무시하고 사용하십시오
()
(기술적으로 "함수가 모든 종류의 인수를 취할 수 있음").
- 괄호 안에 함수 인수 목록을 지정할 수 있지만,이 문제를 해결하기 위해 무시하고 사용하십시오
표기법을 읽는 방법은 다음과 같습니다.
int i; // i is an int
float *f; // f is a pointer to a float
my_struct_t s[10]; // s is an array of 10 my_struct_t
int func(); // func is a function returning an int
잡는 것은 배열의 배열 이나 함수 포인터의 배열 또는 포인터의 배열에 대한 포인터 와 같이 더 복잡한 유형을 형성하기 위해 이들을 모두 혼합 할 수 있다는 것 입니다 .
int arr[3][4];
// arr is an array of 3 arrays of 4 ints
int (*fptrs[10])();
// fptrs is an array of 10 pointers to functions returning an int
float *(*p)[16];
// p is a pointer to an array of 16 pointers to float
이 복잡한 진술을 어떻게 읽었습니까?
- 변수 이름에서 시작하십시오.
(name) is ...
- 우선 순위가 가장 높은 수정자를 선택하십시오.
- 읽어:
* -> pointer to ...
[N] -> array of N ...
() -> function returning ...
- 수정자가 모두 소모 될 때까지 2와 3을 반복하십시오.
- 마지막으로 기본 유형을 읽으십시오.
... (base type).
C에서 접두사 연산자는 접두사 연산자보다 우선하며 유형 한정자는 예외가 아닙니다. 따라서, []
및 ()
바인드 제 다음 *
. (...)
함수 연산자와 혼동하지 않아야 하는 한 쌍의 Parens 내부에있는 모든 것이 먼저 외부에 바인딩됩니다.
예시 된 예 :
int (*fptrs[10])();
fptrs fptrs is ...
[10] array of 10 ... // [] takes precedence over *
(* ) pointer to ...
() function returning ...
int int
태스크
C로 작성된 변수 선언문의 행이 주어지면, 위에 표시된 방법을 사용하여 행을 설명하는 영어 표현식을 출력하십시오.
입력
입력은 단일 기본 유형, 단일 변수 이름, 0 개 이상의 유형 수정 자 및 끝 세미콜론을 포함하는 단일 C 문입니다. 위에서 다룬 모든 구문 요소와 함께 다음을 구현해야합니다.
- 기본 유형과 변수 이름은 모두 정규식과 일치합니다
[A-Za-z_][A-Za-z0-9_]*
. - 이론적으로 프로그램은 유형 한정자를 무제한 지원해야합니다.
다음과 같은 방법으로 다른 C 구문 요소를 단순화 할 수 있습니다 (전체 구현도 환영합니다).
- 기본 유형은 항상 하나의 단어, 예를 들어
int
,float
,uint32_t
,myStruct
. 같은unsigned long long
것은 테스트되지 않습니다. - 배열 표기를 들어
[N]
, 숫자는N
항상 하나의 양의 정수 (10) 것들과 같은 기준으로 작성된 것입니다int a[5+5]
,int a[SIZE]
또는int a[0x0f]
테스트되지 않습니다. - 함수 표기법의
()
경우 위에서 지적한 것처럼 매개 변수가 전혀 지정되지 않습니다. - 공백의 경우 공백 문자 만
0x20
사용됩니다. 예를 들어 프로그램을 공백의 특정 사용으로 제한 할 수 있습니다.- 기본 유형 다음에 한 칸만 사용하십시오.
- 토큰 사이에 공간을 사용하십시오
- 그러나 토큰 분리 자보다 많은 정보를 전달하기 위해 둘 이상의 연속 공백을 사용할 수 없습니다.
C 구문에 따르면 다음 세 가지 조합은 유효하지 않으므로 테스트되지 않습니다.
f()()
기능 반환 기능f()[]
함수 반환 배열a[]()
N 함수의 배열
C 개발자는 이와 동등한 형식을 대신 사용합니다 (이 모든 것은 테스트 사례에서 다룹니다).
(*f())()
함수를 가리키는 함수 반환 포인터*f()
배열의 첫 번째 요소에 대한 포인터를 반환하는 함수(*a[])()
함수에 대한 N 포인터의 배열
산출
결과는 단일 영어 문장입니다. 영어 문법 (예 : a, an, the
, 단수 / 복수 형식, 끝점 (마침표))을 사용할 필요는 없습니다 (그러나 원하는 경우 가능 ). 각 단어는 하나 이상의 공백 (공백, 탭, 개행)으로 구분되어야 결과를 사람이 읽을 수 있습니다.
다시, 변환 과정은 다음과 같습니다.
- 변수 이름에서 시작하십시오.
(name) is ...
- 우선 순위가 가장 높은 수정자를 선택하십시오.
- 읽어:
* -> pointer to ...
[N] -> array of N ...
() -> function returning ...
- 수정자가 모두 소모 될 때까지 2와 3을 반복하십시오.
- 마지막으로 기본 유형을 읽으십시오.
... (base type).
테스트 사례
int i; // i is int
float *f; // f is pointer to float
my_struct_t s[10]; // s is array of 10 my_struct_t
int func(); // func is function returning int
int arr[3][4]; // arr is array of 3 array of 4 int
int (*fptrs[10])(); // fptrs is array of 10 pointer to function returning int
float *(*p)[16]; // p is pointer to array of 16 pointer to float
_RANdom_TYPE_123 (**(*_WTH_is_TH15)())[1234][567];
/* _WTH_is_TH15 is pointer to function returning pointer to pointer to array of
1234 array of 567 _RANdom_TYPE_123 */
uint32_t **(*(**(*(***p)[2])())[123])[4][5];
/* p is pointer to pointer to pointer to array of 2 pointer to function returning
pointer to pointer to array of 123 pointer to array of 4 array of 5 pointer to
pointer to uint32_t */
uint32_t (**((*(**(((*(((**(*p)))[2]))())))[123])[4])[5]);
// Same as above, just more redundant parens
some_type (*(*(*(*(*curried_func())())())())())();
/* curried_func is function returning pointer to function returning pointer to
function returning pointer to function returning pointer to
function returning pointer to function returning some_type */
득점 및 당첨 기준
이것은 코드 골프 도전입니다. 바이트 수가 가장 적은 프로그램이 승리합니다.
int arr[3][4];
이다 an array of 3 arrays of 4 ints
(당신이 말한대로), 또는 an array of 4 arrays of 3 ints
?
;
에 줄 끝에 포함되어 있습니까?