Você está na página 1de 77

Elementos de programao em C

Funes e procedimentos

Francisco A. C. Pinheiro, Elementos de Programao em C, Bookman, 2012.

Visite os stios do livro para obter material adicional: www.bookman.com.br e www.facp.pro.br/livroc

() Elementos de programao em C 1 / 48
Sumrio

1 Fluxo de execuo

2 Funes e procedimentos

3 Declarao de funo e procedimento

4 Parmetros e argumentos

5 Chamadas a funes

6 Valor de retorno

7 Funes recursivas

8 () Elementos de programao em C 2 / 48
Fluxo de execuo

Fluxo de execuo

ROTINA PRINCIPAL ROTINA A


... comando 1
comando 1 comando 2
comando 2 chama rotina A comando 3
(A) comando 3 comando 4
comando 4
...
comando n

ROTINA PRINCIPAL ROTINA A ROTINA B


... comando 1 comando 1
chama rotina B
comando 1 comando 2 comando 2
comando 2 chama rotina A comando 3 comando 3
(B) comando 3 comando 4 comando 4
comando 4 comando 5
...
comando n

() Elementos de programao em C 3 / 48
Funes e procedimentos

Funes e procedimentos

Funo. Caracterizada por retornar um valor como resultado do


processamento.
Procedimento. Caracterizado por no produzir valor de retorno.

() Elementos de programao em C 4 / 48
Declarao de funo e procedimento

Sintaxe da declarao

hDeclFunoi ::= hCabealhoi ;

hDefinioFunoi ::= hCabealhoi hCorpoFunoi

hCabealhoi ::= [ inline ] [ _Noreturn ] hDeclTipoi hIdentFunoi (


hListaParmetrosi [ , ... ] )

hCabealhoi ::= [ inline ] [ _Noreturn ] hDeclTipoi hIdentFunoi ( )

hIdentFunoi ::= Identificador da funo.

hListaParmetrosi ::= hParmetroi [ , hListaParmetrosi ]

hCorpoFunoi ::= Declaraes e comandos, entre chaves, que


implementam a funo.

() Elementos de programao em C 5 / 48
Declarao de funo e procedimento Declarao, definio e prottipo

Declarao, definio e prottipo

Declarao de funo especifica o tipo do valor de retorno, a identificao


da funo e, opcionalmente, o tipo dos seus parmetros.
Definio de funo a declarao que especifica o corpo da funo, isto
, causa alocao de memria.
Prottipo de funo a declarao que contm o tipo dos parmetros da
lista de parmetros ou void, se a funo no possuir lista de
parmetros.

() Elementos de programao em C 6 / 48
Declarao de funo e procedimento Declarao, definio e prottipo

Declarao, definio e prottipo

Declarao de funo especifica o tipo do valor de retorno, a identificao


da funo e, opcionalmente, o tipo dos seus parmetros.
Definio de funo a declarao que especifica o corpo da funo, isto
, causa alocao de memria.
Prottipo de funo a declarao que contm o tipo dos parmetros da
lista de parmetros ou void, se a funo no possuir lista de
parmetros.

Observao:
A definio de uma funo induz sua declarao (consistindo do cabealho
da funo.

() Elementos de programao em C 6 / 48
Declarao de funo e procedimento Declarao, definio e prottipo

Declarao, definio e prottipo

int funA(); Declarao.

int funB(void); Prottipo.

void funC(int, float); Prottipo.

void funD(int a, float b); Prottipo.

float funE(int a) { Definio.


/* codigo omitido */ Declarao induzida:
} float funE(int a)

() Elementos de programao em C 7 / 48
Declarao de funo e procedimento Declarao, definio e prottipo

Declarao, definio e prottipo

Exemplo
No trecho de cdigo ao lado, que # include < stdio .h >
funes esto definidas, apenas const int funB ();
declaradas e declaradas como char * funC ( int , float );
void funD ( long int a );
prottipos? int main ( void ) {
float funE ( void );
/* codigo omitido */
return 0;
}
long funA ( int a ) {
/* codigo omitido */
}

() Elementos de programao em C 8 / 48
Declarao de funo e procedimento Declarao, definio e prottipo

Declarao, definio e prottipo

Exemplo
No trecho de cdigo ao lado, que # include < stdio .h >
funes esto definidas, apenas const int funB ();
declaradas e declaradas como char * funC ( int , float );
void funD ( long int a );
prottipos? int main ( void ) {
float funE ( void );
Resposta: /* codigo omitido */
definidas: main, funA return 0;
}
declaradas: funB long funA ( int a ) {
prottipos: funC, funD, funE /* codigo omitido */
}

() Elementos de programao em C 8 / 48
Declarao de funo e procedimento Escopo e declarao implcita

Escopo e declarao implcita

Escopo de uma declarao de funo:


Bloco
Arquivo

Entretanto, a definio de uma funo no pode ter escopo de bloco.

() Elementos de programao em C 9 / 48
Declarao de funo e procedimento Escopo e declarao implcita

Escopo e declarao implcita

Quando uma chamada a uma funo fun ocorre fora do escopo de sua
declarao, o compilador assume a existncia de uma

Declarao implcita
int fun();

A declarao de uma funo com a lista de parmetros vazia faz com que o
compilador no verifique a consistncia entre os argumentos usados na
chamada e os parmetros declarados na definio da funo.

() Elementos de programao em C 10 / 48
Declarao de funo e procedimento Escopo e declarao implcita

Escopo e declarao implcita

Exemplo
O escopo do prottipo para a funo # include < stdio .h >
funA vai do ponto de sua declarao int main ( void ) {
at o fim da funo main. funA (4);
int funA ( double , int );
funA (3.7 , 66);
As referncias a funA fora desse funB (" exem ");
escopo so interpretadas no escopo return 0;
de uma declarao implcita int }
void funB ( int a ) {
funA(). funA ( a , 57);
}

A funo funB possui uma declarao explcita (induzida por sua definio)
e uma implcita.

() Elementos de programao em C 11 / 48
Parmetros e argumentos

Parmetros e argumentos

Parmetros so as variveis declaradas na definio de uma funo.


Argumentos so as expresses usadas na chamada a uma funo.

Passagem de argumentos
Por valor. Uma cpia do argumento atribuda ao parmetro
correspondente.
Por referncia. O parmetro passa a ser uma referncia ao argumento
usado na chamada.

() Elementos de programao em C 12 / 48
Parmetros e argumentos

Parmetros e argumentos

Parmetros so as variveis declaradas na definio de uma funo.


Argumentos so as expresses usadas na chamada a uma funo.

Passagem de argumentos
Por valor. Uma cpia do argumento atribuda ao parmetro
correspondente.
Por referncia. O parmetro passa a ser uma referncia ao argumento
usado na chamada.

Observao:
Em C, toda passagem de argumento por valor!

() Elementos de programao em C 12 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Parmetros no podem conter especificador de classe, exceto


register.
Parmetros no podem ser iniciados.
Nas declaraes, alm dos tipos completos, os parmetros podem ser
de um tipo incompleto, ou de um tipo vetor de tamanho varivel no
especificado ([*]).
Nas definies, os parmetros s podem ser de um tipo completo, ou
de um tipo vetor de tamanho varivel no definido ([ ]).
Nas definies, parmetros devem ser nomeados.

() Elementos de programao em C 13 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Parmetros no podem conter especificador de classe, exceto


register.
Parmetros no podem ser iniciados.
Nas declaraes, alm dos tipos completos, os parmetros podem ser
de um tipo incompleto, ou de um tipo vetor de tamanho varivel no
especificado ([*]).
Nas definies, os parmetros s podem ser de um tipo completo, ou
de um tipo vetor de tamanho varivel no definido ([ ]).
Nas definies, parmetros devem ser nomeados.

Observao:
As restries referentes a ponteiros e vetores devem ser discutidas aps o
estudo desses tpicos!

() Elementos de programao em C 13 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Exemplo
Declarao/Definio Erro
int funA(float a = 3.4f, int);

int funA(float a, int b = 4) {


/* codigo omitido */
}

int funA(float a, int) {


/* codigo omitido */
}

int funA(static int a) {


/* codigo omitido */
}

() Elementos de programao em C 14 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Exemplo
Declarao/Definio Erro
int funA(float a = 3.4f, int); parmetros com iniciao.

int funA(float a, int b = 4) {


/* codigo omitido */
}

int funA(float a, int) {


/* codigo omitido */
}

int funA(static int a) {


/* codigo omitido */
}

() Elementos de programao em C 14 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Exemplo
Declarao/Definio Erro
int funA(float a = 3.4f, int); parmetros com iniciao.

int funA(float a, int b = 4) { parmetros com iniciao.


/* codigo omitido */
}

int funA(float a, int) {


/* codigo omitido */
}

int funA(static int a) {


/* codigo omitido */
}

() Elementos de programao em C 14 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Exemplo
Declarao/Definio Erro
int funA(float a = 3.4f, int); parmetros com iniciao.

int funA(float a, int b = 4) { parmetros com iniciao.


/* codigo omitido */
}

int funA(float a, int) { parmetro no-nomeado.


/* codigo omitido */
}

int funA(static int a) {


/* codigo omitido */
}

() Elementos de programao em C 14 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Exemplo
Declarao/Definio Erro
int funA(float a = 3.4f, int); parmetros com iniciao.

int funA(float a, int b = 4) { parmetros com iniciao.


/* codigo omitido */
}

int funA(float a, int) { parmetro no-nomeado.


/* codigo omitido */
}

int funA(static int a) { classe diferente de register.


/* codigo omitido */
}

() Elementos de programao em C 14 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]);

int funA(int []);

int funA(int a[*]) {


/* codigo omitido */
}

int funA(int a[]) {


/* codigo omitido */
}

int funA(struct reg);

int funA(struct reg a) {


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]); Declarao vlida.

int funA(int []);

int funA(int a[*]) {


/* codigo omitido */
}

int funA(int a[]) {


/* codigo omitido */
}

int funA(struct reg);

int funA(struct reg a) {


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]); Declarao vlida.

int funA(int []); Declarao vlida.

int funA(int a[*]) {


/* codigo omitido */
}

int funA(int a[]) {


/* codigo omitido */
}

int funA(struct reg);

int funA(struct reg a) {


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]); Declarao vlida.

int funA(int []); Declarao vlida.

int funA(int a[*]) { Definio invlida ([*] apenas em declaraes).


/* codigo omitido */
}

int funA(int a[]) {


/* codigo omitido */
}

int funA(struct reg);

int funA(struct reg a) {


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]); Declarao vlida.

int funA(int []); Declarao vlida.

int funA(int a[*]) { Definio invlida ([*] apenas em declaraes).


/* codigo omitido */
}

int funA(int a[]) { Definio vlida.


/* codigo omitido */
}

int funA(struct reg);

int funA(struct reg a) {


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]); Declarao vlida.

int funA(int []); Declarao vlida.

int funA(int a[*]) { Definio invlida ([*] apenas em declaraes).


/* codigo omitido */
}

int funA(int a[]) { Definio vlida.


/* codigo omitido */
}

int funA(struct reg); Declarao vlida.

int funA(struct reg a) {


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Parmetros e argumentos

Parmetros e argumentos restries

Declarao/Definio Validade
int funA(int [*]); Declarao vlida.

int funA(int []); Declarao vlida.

int funA(int a[*]) { Definio invlida ([*] apenas em declaraes).


/* codigo omitido */
}

int funA(int a[]) { Definio vlida.


/* codigo omitido */
}

int funA(struct reg); Declarao vlida.

int funA(struct reg a) { Definio invlida (parmetro com tipo incompleto).


/* codigo omitido */
}
() Elementos de programao em C 15 / 48
Chamadas a funes

Chamadas a funes

Os parmetros declarados como funo retornando hT i e vetor de hT i


tm seus tipos ajustados para ponteiro para funo retornando hT i e
ponteiro para hT i, respectivamente.
As expresses usadas como argumentos so avaliadas e seus valores
atribudos aos parmetros correspondentes
A avaliao dos argumentos no sequenciada
A execuo inicia apenas aps a avaliao e atribuio de todos os
argumentos.
O modo como os valores so atribudos aos parmetros depende da
chamada ocorrer dentro ou fora do escopo de um prottipo da funo.

() Elementos de programao em C 16 / 48
Chamadas a funes

Chamadas a funes

No escopo de um prottipo
Os argumentos so convertidos implicitamente (como em uma
atribuio) no tipo dos parmetros correspondentes.

() Elementos de programao em C 17 / 48
Chamadas a funes

Chamadas a funes

No escopo de um prottipo
Os argumentos so convertidos implicitamente (como em uma
atribuio) no tipo dos parmetros correspondentes.

Fora do escopo de um prottipo


Os argumentos so promovidos segundo a seguinte promoo padro
dos argumentos:
A promoo inteira aplicada a cada argumento do tipo inteiro.
Os argumentos do tipo float so promovidos para double.

() Elementos de programao em C 17 / 48
Chamadas a funes

Chamadas a funes

No escopo de um prottipo
Os argumentos so convertidos implicitamente (como em uma
atribuio) no tipo dos parmetros correspondentes.

Fora do escopo de um prottipo


Os argumentos so promovidos segundo a seguinte promoo padro
dos argumentos:
A promoo inteira aplicada a cada argumento do tipo inteiro.
Os argumentos do tipo float so promovidos para double.

O comportamento indefinido se
A quantidade de argumentos diferente da quantidade de parmetros.
O tipo de um argumento (aps a promoo) no compatvel com o
tipo do parmetro correspondente.
() Elementos de programao em C 17 / 48
Valor de retorno

Valor de retorno

O comando return finaliza a execuo da funo produzindo o valor de


retorno que resulta da avaliao da sua expresso.
Exemplo
return 2 * y; Retorna com o valor 2 y.

() Elementos de programao em C 18 / 48
Valor de retorno

Valor de retorno

O tipo do valor produzido pela expresso deve ser compatvel com o


tipo declarado.
Se o tipo declarado void, o comando return no deve possuir
expresso de retorno.
O tipo declarado para o valor de retorno no pode ser um tipo funo
ou vetor.
Em uma definio de funo o tipo declarado para o valor de retorno
deve ser completo.

() Elementos de programao em C 19 / 48
Funes recursivas

Funes recursivas

Uma funo recursiva quando chama ela mesma, direta ou indiretamente.

Recursividade direta, quando uma funo chama ela mesma.


Recursividade indireta, quando uma funo chama outra funo que
chama outra, em uma sequncia que eventualmente resulta em
uma chamada funo inicial.

() Elementos de programao em C 20 / 48
Funes recursivas

Funes recursivas

So adequadas quando o problema pode ser expresso de modo recursivo


Funo potncia
Para b > 0:
(
a Se b = 1 (condio de parada)
ab =
a a(b1)

() Elementos de programao em C 21 / 48
Funes recursivas

Funes recursivas

So adequadas quando o problema pode ser expresso de modo recursivo


Funo potncia
Para b > 0:
(
a Se b = 1 (condio de parada)
ab =
a a(b1)

Funo fatorial
Para a 0:
(
1 Se a = 0 (condio de parada)
a! =
a (a 1)!

() Elementos de programao em C 21 / 48
Funes recursivas

Funes recursivas

Exemplo
O programa ao lado calcula a # include < stdio .h >
int potencia ( int , int );
funo potncia de modo int main ( void ) {
recursivo. printf ("% d \ n " , potencia (5 , 3));
return 0;
}
int potencia ( int a , int b ) {
if ( b == 1) {
return a ;
}
return a * potencia (a , --b );
}

() Elementos de programao em C 22 / 48
Funes recursivas

Funes recursivas

interrompe potencia(5,2)
inicia potencia(5,1)
interrompe potencia(5,3)
inicia potencia(5,2)
potencia ( 5 , 1 )
potencia ( 5 , 2 ) if (1 == 1) {
return 5;
if (2 == 1) {
}
potencia ( 5 , 3 ) return 5;
return 5 * potencia(5,0);
}
if (3 == 1) {
return 5 * potencia(5,1);
return 5;
}
return 5 * potencia(5,2); 5
termina potencia(5,1)
retorna 5
25 25

125
termina potencia(5,2)
retorna 25
termina potencia(5,3)
retorna 125

() Elementos de programao em C 23 / 48
Nmero varivel de parmetros

Nmero varivel de parmetros

O uso de reticncias na declarao de funes especifica uma quantidade


varivel de parmetros.

float funA(int a, ...)


Funo retornando float com no mnimo um parmetro. O primeiro
parmetro do tipo int e os demais no so definidos.

void funB(char a, long b, ...)


Funo sem valor de retorno com no mnimo dois parmetros. O primeiro
do tipo char, o segundo do tipo long e os demais no so definidos.

() Elementos de programao em C 24 / 48
Nmero varivel de parmetros

Acessando os argumentos adicionais

O cabealho stdarg.h possui macros para acessar os argumentos


adicionais de uma funo com argumentos variveis.

() Elementos de programao em C 25 / 48
Nmero varivel de parmetros

Acessando os argumentos adicionais

O cabealho stdarg.h possui macros para acessar os argumentos


adicionais de uma funo com argumentos variveis.
1 Define-se uma lista que receber os argumentos correspondentes aos
parmetros no declarados:
va_list hlistaArg i;

() Elementos de programao em C 25 / 48
Nmero varivel de parmetros

Acessando os argumentos adicionais

O cabealho stdarg.h possui macros para acessar os argumentos


adicionais de uma funo com argumentos variveis.
1 Define-se uma lista que receber os argumentos correspondentes aos
parmetros no declarados:
va_list hlistaArg i;
2 Inicia-se a lista de argumentos usando a macro va_start e
informando a identificao do ltimo parmetro declarado:
va_start(hlistaArg i, hIdentUltimoPar i);

() Elementos de programao em C 25 / 48
Nmero varivel de parmetros

Acessando os argumentos adicionais

O cabealho stdarg.h possui macros para acessar os argumentos


adicionais de uma funo com argumentos variveis.
1 Define-se uma lista que receber os argumentos correspondentes aos
parmetros no declarados:
va_list hlistaArg i;
2 Inicia-se a lista de argumentos usando a macro va_start e
informando a identificao do ltimo parmetro declarado:
va_start(hlistaArg i, hIdentUltimoPar i);
3 Usa-se a macro va_arg para obter o prximo argumento da lista como
um valor do tipo htipoArg i:
va_arg(hlistaArg i, htipoArg i);

() Elementos de programao em C 25 / 48
Nmero varivel de parmetros

Acessando os argumentos adicionais

O cabealho stdarg.h possui macros para acessar os argumentos


adicionais de uma funo com argumentos variveis.
1 Define-se uma lista que receber os argumentos correspondentes aos
parmetros no declarados:
va_list hlistaArg i;
2 Inicia-se a lista de argumentos usando a macro va_start e
informando a identificao do ltimo parmetro declarado:
va_start(hlistaArg i, hIdentUltimoPar i);
3 Usa-se a macro va_arg para obter o prximo argumento da lista como
um valor do tipo htipoArg i:
va_arg(hlistaArg i, htipoArg i);
4 Ao final, libera-se a lista de argumentos com a macro va_end:
va_end(hlistaArg i);

() Elementos de programao em C 25 / 48
Nmero varivel de parmetros

Nmero varivel de parmetros

Exemplo
A funo funA ao lado void funA ( int qtd , ...) {
recebe um nmero va_list lpar ;
varivel de argumentos: va_start ( lpar , qtd );
int argc ;
O primeiro indica double argd ;
for ( int i = 0; i < qtd - 1; i ++) {
quantos viro a argc = va_arg ( lpar , int );
seguir. printf ("% c " , argc );
}
Todos os demais, if ( qtd > 0) {
exceto o ltimo so argd = va_arg ( lpar , double );
printf ("% f \ n " , argd );
do tipo int. }
O ltimo do tipo va_end ( lpar );
}
double

() Elementos de programao em C 26 / 48
Desvios no locais

Desvios no locais

A macro setjmp e a funo longjmp (declaradas em setjmp.h) so


usadas em conjunto para implementar desvios no locais:
setjmp salva o ambiente de execuo.
longjmp retorna ao ponto onde o ambiente de execuo foi salvo.

() Elementos de programao em C 27 / 48
Desvios no locais

Desvios no locais

int setjmp(jmp_buf amb)

Salva o ambiente de execuo na rea de armazenamento temporrio amb.


A macro pode ser executada a partir do fluxo normal de execuo ou em
decorrncia de uma chamada a longjmp.
Valor de retorno. Zero, se executada a partir do fluxo normal de execuo.
O valor de retorno quando a macro executada em decorrncia de uma
chamada a longjmp igual ao argumento fornecido funo longjmp ou
1, se esse argumento for igual a 0.

() Elementos de programao em C 28 / 48
Desvios no locais

Desvios no locais

_Noreturn void longjmp(jmp_buf amb, int res)

Restaura o ambiente de execuo armazenado em amb, causa o desvio para


o ponto de chamada da funo setjmp que salvou o ambiente amb e define
res como o valor resultante dessa nova chamada a setjmp.
Valor de retorno. No tem.

() Elementos de programao em C 29 / 48
Desvios no locais

Desvios no locais
Exemplo. Qual o comportamento do programa se o valor lido for 1?
# include < stdio .h > }
# include < setjmp .h > void funA ( int x ) {
void funA ( int ); printf (" inicio funA \ n ");
void funB ( int ); if ( x > 0) {
jmp_buf estado ; longjmp ( estado , 2);
int main ( void ) { }
int i = 0; funB (2 * x );
printf (" inicio prog \ n "); printf (" fim funA \ n ");
( void ) setjmp ( estado ); }
printf (" Valor de i : "); void funB ( int y ) {
scanf ("% d " , & i ); printf (" inicio funB \ n ");
if ( i < 2) { if ( y < 0) {
funA ( i ); longjmp ( estado , 4);
} }
printf (" fim prog \ n "); printf (" fim funB \ n ");
return 0; }

() Elementos de programao em C 30 / 48
Desvios no locais

Desvios no locais
Exemplo. Qual o comportamento do programa se o valor lido for 1?

O programa volta funo main, para uma nova leitura, diretamente da


funo funB, sem executar os retornos convencionais.
inicio prog
Valor de i: -1
inicio funA
inicio funB
Valor de i:

() Elementos de programao em C 30 / 48
A funo main

A funo main

int main(void)

Inicia a execuo do programa.


Valor de retorno. Valor inteiro indicando o estado do trmino da execuo.

int main(int qtd_arg, char *args[])

Inicia a execuo do programa armazenando em qtd_arg a quantidade de


argumentos da linha de comando e em args os argumentos fornecidos.
Valor de retorno. Valor inteiro indicando o estado do trmino da execuo.

() Elementos de programao em C 31 / 48
Classe de armazenamento

Classe de armazenamento

static. Modo de alocao esttico. Ligao interna.


extern. Modo de alocao esttico. Ligao externa, exceto se houver no
mesmo escopo uma declarao prvia com ligao interna, caso em
que a ligao ser interna.
Sem qualificador. Modo de alocao e ligao determinados como se
tivesse sido declarada com o qualificador extern.

() Elementos de programao em C 32 / 48
Classe de armazenamento

Classe de armazenamento

Exemplo
Unid. compilao 1 Unid. compilao 2

# include < stdio .h > # include < stdio .h >


static void funA ( void ); static void funA ( void );
void funB ( void ); void funB ( void );
extern void funC ( void ); void funC ( void );
void funD ( void ); extern void funD ( void );
int main ( void ) { void funB ( void ) {
funA (); funB (); funC (); funD (); printf (" funB \ n ");
return 0; funA ();
} }
static void funA ( void ) { extern void funA ( void ) {
printf (" funA (1)\ n "); printf (" funA (2)\ n ");
} }
void funD ( void ) { extern void funC ( void ) {
printf (" funD \ n "); printf (" funC \ n ");
} funD ();
}

() Elementos de programao em C 33 / 48
Funes em linha

Funes em linha

O especificador inline orienta o compilador a inserir o cdigo da


funo no local da sua chamada.
Qualquer funo com ligao interna pode ser declarada em linha.
Uma funo com ligao externa declarada em linha deve ser definida
na mesma unidade de compilao que a declarao em linha.

() Elementos de programao em C 34 / 48
Funes em linha

Funes em linha

Exemplo
# include < stdio .h > # include < stdio .h >
inline static int dobro ( int ); static int dobro ( int );
int main ( void ) { int main ( void ) {
printf ("% d \ n " , dobro (23)); printf ("% d \ n " , dobro (23));
return 0; return 0;
} }
static int dobro ( int a ) { inline static int dobro ( int a ) {
return 2 * a ; return 2 * a ;
} }

() Elementos de programao em C 35 / 48
Funes em linha

Funes em linha

Exemplo
# include < stdio .h > # include < stdio .h >
inline static int dobro ( int ); static int dobro ( int );
int main ( void ) { int main ( void ) {
printf ("% d \ n " , dobro (23)); printf ("% d \ n " , dobro (23));
return 0; return 0;
} }
static int dobro ( int a ) { inline static int dobro ( int a ) {
return 2 * a ; return 2 * a ;
} }

A chamada a dobro no programa direita pode no ser colocada em


linha porque no est no escopo de uma declarao em linha.
Muitas outras circunstncias podem fazer com que uma funo no
seja colocada em linha.

() Elementos de programao em C 35 / 48
O tipo de uma funo

O tipo de uma funo

O tipo de uma funo caracterizado pelo tipo do seu valor de retorno e


dos seus parmetros.

Declarao Tipo
int funA() int ()
int funB(void) int (void)
char *funC(int, float) char *(int, float)
struct reg funD(int) struct reg (int)

() Elementos de programao em C 36 / 48
O tipo de uma funo

O tipo de uma funo

O tipo de uma funo caracterizado pelo tipo do seu valor de retorno e


dos seus parmetros.

Declarao Tipo
int funA() int ()
int funB(void) int (void)
char *funC(int, float) char *(int, float)
struct reg funD(int) struct reg (int)

Funo retornando int.

() Elementos de programao em C 36 / 48
O tipo de uma funo

O tipo de uma funo

O tipo de uma funo caracterizado pelo tipo do seu valor de retorno e


dos seus parmetros.

Declarao Tipo
int funA() int ()
int funB(void) int (void)
char *funC(int, float) char *(int, float)
struct reg funD(int) struct reg (int)

Funo (void) retornando int.

() Elementos de programao em C 36 / 48
O tipo de uma funo

O tipo de uma funo

O tipo de uma funo caracterizado pelo tipo do seu valor de retorno e


dos seus parmetros.

Declarao Tipo
int funA() int ()
int funB(void) int (void)
char *funC(int, float) char *(int, float)
struct reg funD(int) struct reg (int)

Funo de int e float retornando ponteiro para char.

() Elementos de programao em C 36 / 48
O tipo de uma funo

O tipo de uma funo

O tipo de uma funo caracterizado pelo tipo do seu valor de retorno e


dos seus parmetros.

Declarao Tipo
int funA() int ()
int funB(void) int (void)
char *funC(int, float) char *(int, float)
struct reg funD(int) struct reg (int)

Funo de int retornando struct reg.

() Elementos de programao em C 36 / 48
O tipo de uma funo Definio de tipo funo

Definio de tipo funo

Um tipo funo pode ser definido com o operador typedef usando-se a


declarao do novo tipo como se fosse a declarao de um prottipo de
funo.
Exemplo
typedef int funA_t(int) O tipo funA_t sinnimo de int (int).
typedef void funB_t(float *, int) O tipo funB_t sinnimo de
void (float *, int).

() Elementos de programao em C 37 / 48
O tipo de uma funo Definio de tipo funo

Definio de tipo funo

Um tipo funo pode ser definido com o operador typedef usando-se a


declarao do novo tipo como se fosse a declarao de um prottipo de
funo.
Exemplo
typedef int funA_t(int) O tipo funA_t sinnimo de int (int).
typedef void funB_t(float *, int) O tipo funB_t sinnimo de
void (float *, int).

Os novos tipos podem ser usados em declaraes:


funA_t fun; declara fun como do tipo funA_t.
funB_t fun; declara fun como do tipo funB_t.

() Elementos de programao em C 37 / 48
O tipo de uma funo Compatibilidade

Compatibilidade de tipos

Dois tipos funo so compatveis


se possuem tipos de valor de retorno compatveis
e, se ambos possuem lista de parmetros, as seguintes condies so
satisfeitas:
a quantidade de parmetros deve ser igual,
os tipos dos parmetros correspondentes devem ser compatveis, e
se uma lista de parmetros contm reticncias, a outra tambm deve
conter.

() Elementos de programao em C 38 / 48
Ponteiro para funo

Ponteiro para funo

Se f_ptr um ponteiro para funo do tipo hT i (void), ento


f_ptr() e (*f_ptr)() causam a execuo da funo apontada pelo
ponteiro;
o valor resultante do tipo hT i.

() Elementos de programao em C 39 / 48
Ponteiro para funo

Ponteiro para funo


Exemplo
O programa ao lado executa a # include < stdio .h >
void funA ( char );
funo void funB ( char );
typedef void fun_t ( char );
funA, se o valor lido for int main ( void ) {
igual a 1 ou int op ;
fun_t * f [2] = { funA , funB };
funB, se o valor lido for printf (" Operacao (1 ou 2): ");
igual a 2. scanf ("% d " , & op );
if (( op == 1) || ( op == 2)) {
f [ op - 1]( x );
}
return 0;
}
void funA ( char c ) {
printf (" funA : % c \ n " , c );
}
void funB ( char c ) {
printf (" funB : % c \ n " , c );
}

() Elementos de programao em C 40 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

Trmino normal
O fluxo da execuo atinge o fim da funo main.
A funo main finalizada pela execuo do comando return.
As funes exit, quick_exit ou _Exit so executadas.
Trmino anormal
A execuo interrompida pela ocorrncia de um erro de execuo no
recupervel, que pode ser lanado pelo ambiente ou pelas funes
raise ou abort.

() Elementos de programao em C 41 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

As seguintes aes podem ser executadas por um programa por ocasio de


seu trmino, dependendo do modo como ele finalizado:
1 Executar as funes de trmino registradas pelas funes atexit ou
at_quick_exit.
2 Gravar nos arquivos de sada os dados ainda no gravados que estejam
em suas reas de armazenamento temporrio.
3 Fechar os arquivos ainda abertos.
4 Remover os arquivos temporrios.

As macros EXIT_SUCCESS e EXIT_FAILURE, bem como as funes atexit,


at_quick_exit, exit, quick_exit, _Exit e abort so declaradas no
cabealho stdlib.h.

() Elementos de programao em C 42 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

int atexit(void (*fun)(void))

Registra a funo apontada por fun, que ser executada se o programa


terminar normalmente. A funo fun deve ser definida como uma funo
sem parmetros retornando void.
Valor de retorno. Zero, se o registro bem sucedido, ou um valor diferente
de 0, em caso de falha.

() Elementos de programao em C 43 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

_Noreturn void exit(int estado)

Causa o trmino normal do programa lanando o cdigo estado para ser


capturado pelo ambiente, e.g. por um roteiro de execuo a partir do qual
o programa foi iniciado.
Valor de retorno. No tem.

() Elementos de programao em C 44 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

_Noreturn void _Exit(int estado)

Causa o trmino normal do programa lanando o cdigo estado para ser


capturado pelo ambiente de execuo. Entretanto, nenhuma funo
registrada com atexit ou signal chamada. A gravao dos dados que
estejam nas reas de armazenamento temporrio associadas s operaes
de sada, o fechamento dos arquivos abertos e a remoo dos arquivos
temporrios dependente da implementao.
Valor de retorno. No tem.

() Elementos de programao em C 45 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

_Noreturn void abort(void)

Lana um sinal SIGABRT, que causar o trmino anormal do programa se


no for capturado e tratado.
Valor de retorno. No tem.

() Elementos de programao em C 46 / 48
Controlando o trmino da execuo

Controlando o trmino da execuo

_Noreturn void abort(void)

Lana um sinal SIGABRT, que causar o trmino anormal do programa se


no for capturado e tratado.
Valor de retorno. No tem.

Observao:
Em um trmino anormal no h garantia de que as reas de
armazenamento temporrio sejam esvaziadas, os arquivos abertos sejam
fechados e os temporrios removidos.

() Elementos de programao em C 46 / 48
Executando comandos do sistema

Executando comandos do sistema

int system(const char *comando)

Envia a cadeia apontada por comando para execuo pelo processador de


comandos, ou determina se o ambiente de execuo possui um processador
de comandos, se a cadeia comando nula. O comportamento indefinido
se a cadeia comando for enviada em um ambiente que no possua
processador de comandos.
Valor de retorno. Se a cadeia comando nula, retorna um valor diferente
de zero, se o ambiente possui um processador de comandos, ou zero, em
caso contrrio. Se comando diferente de nulo, o valor retornado depende
da implementao.

() Elementos de programao em C 47 / 48
Bibliografia

Bibliografia

ISO/IEC
C Programming Language Standard
ISO/IEC 9899:2011, International Organization for Standardization;
International Electrotechnical Commission, 3rd edition, WG14/N1570
Committee final draft, abril de 2011.
Francisco A. C. Pinheiro
Elementos de programao em C
Bookman, Porto Alegre, 2012.
www.bookman.com.br, www.facp.pro.br/livroc

() Elementos de programao em C 48 / 48