Você está na página 1de 2

Regra "direita-esquerda"

A regra "direita-esquerda" uma regra completamente regular decifrar as declaraes em C. E tambm muito til para cri-las. Primeiro, os smbolos. Leia-se: * como "ponteiro para" [] como "vetor de" () como "funo que retorna" Quando voc encontr-los na declarao. Passo 1 Encontre o identificador. Este o seu ponto de partida. Ento diga para voc mesmo, "identificador ". Voc acaba de comear sua declarao. Passo 2 Olhe para os smbolos direita do identificador. Se, digamos, voc encontre "()", ento lemos "identificador uma funo que retorna". Ou, se voc encontrasse um "[]", voc diria "identificador um vetor de". Continue caminhando para a direita at no encontrar mais smbolos OU chegar a um parntese direito ")". (Se voc encontrar um parntese esquerdo, significa que o incio do smbolo (), mesmo que haja alguma coisa entre os parnteses. Mais informao abaixo). Passo 3 Olhe para os smbolos a esquerda do identificador. Se no for nenhum dos smbolos acima (digamos, algo como "int"), apenas o diga. Caso contrrio, traduza-o para portugus usando a tabela acima. Mantenha lendo para esquerda at acabar os smbolos OU chegar a um parntese esquerdo "(". Agora repita os passos 2 e 3 at formar a declarao. Aqui h alguns exemplos: a. int *p[]; 1. Encontre o identificador. "p " int *p[]; para

2. Mova para direita at acabar os smbolos ou encontrar ")". int *p[]; "p um vetor de" 3. No d para continuar pela direita (acabou os smbolos), ento mova para esquerda e encontre: int *p[]; "p um vetor de ponteiro para" 4. Mantenha lendo para esquerda e encontre: int *p[]; "p um vetor de ponteiro para inteiro (ou para int)". b. int *(*func())(); 1. Identificador: "func " int *(*func())();

2. Mova para direita. int *(*func())(); "func uma funo que retorna" 3. No se pode mover mais para a direita porque chegamos a um ")", ento movemos para esquerda. int *(*func())(); "func uma funo que retorna um ponteiro para" 4. No se pode mover mais para a esquerda porque chegamos a um "(", ento voltamos rumo direita. int *(*func())(); "func uma funo que retorna um ponteiro para funo que retorna" 5. Vamos novamente para esquerda (no existem mais smbolos). int *(*func())(); "func uma funo que retorna um ponteiro para funo que retorna um ponteiro para"

6. E finalmente, mantemos indo para esquerda. int *(*func())(); "func uma funo que retorna um ponteiro para funo que retorna um ponteiro para inteiro (ou int)" Como voc pode ver, esta regra muito til. Voc tambm pode us-la para fazer um teste de validao (sanity check) enquanto cria suas declaraes, e para ter uma dica sobre onde colocar o prximo smbolo ou se parnteses so requeridos, etc. Algumas declaraes parecem mais complicadas devido aos tamanhos de vetores e/ou listas de argumentos na prototipao. Se voc ver "[3]", leia-se como "vetor (tamanho 3) de...". Se voc ver "(char *, int)", leia-se como "funo que recebe (char *, int) e que retorna...". Aqui vai uma interessante: int (*(*interessante)(char *,double))[9][20]; No iremos decifr-la passo a passo. Ento: "interessante um ponteiro para uma funo que recebe (char *, double) e que retorna um ponteiro para um vetor (tamanho 9) de vetor (tamanho 20) de inteiro." Observe a parte sublinhada. Voc pode ler um vetor de vetor como uma matriz, neste caso, de 9x20. Como voc pode ver, no to complicado se voc se livrar dos tamanhos dos vetores e das listas de argumentos: int (*(*interessante)())[][]; Assim voc pode decifr-la desta forma e colocar os tamanhos dos vetores e as listas de argumentos depois. Algumas palavras finais: Veja que possvel fazer uma declarao ilegal usando esta regra; portanto, algum conhecimento do que ilegal em C necessrio. Por exemplo, se acima tivssemos: int *((*interessante)())[][]; Seria: "interessante um ponteiro para uma funo que retorna um vetor de vetor (matriz) de ponteiro para inteiro". Desde que uma funo no pode retornar um vetor, mas somente um ponteiro para um vetor, esta declarao ilegal.

Will will@kfw.com uunet!charyb!will Traduzido e adaptado para o portugus

Você também pode gostar