Você está na página 1de 815
2 Cc Completo e Total 3a Edicao Revista e Atualizada Herbert Schildt Traducao e Revisto Técnica Roberto Carlos Mayer Diretor da Mayer & Bunge Informética Prof. do Departamento de Cigncia da Computagao da USP-SP MAKRON Books Ltda. Rua Tabapua, 1.348 — Itaim-Bibi 747 — Lapa (CEP 04533-004 — Sao Paulo — SP CEP 05065-110— Sao Paulo — SP (11) 3849-8604 e (11) 3845-6622 (11) 3611-0740 e-mail: makron@books.com.br fax (11) 3611-0444 Siio Paulo + Rio de Janeiro * Ribeirdo Preto + Belém * Belo Horizonte + Brasilia * Campo Grande Cuiabéi + Curitiba + Floriandpolis + Fortaleca * Goidnia * Manaus + Porto Alegre + Recife + Salvador Brasil » Argentina * Colmbia * Costa Rica * Chile * Espanha * Guatemala + México * Pere + Porto Rico * Venezuela Do original C: The Complete Reference — Third Edition Copyright © 1995 McGraw-Hill, Inc Copyright © 1987 Makron Books do Brasil Editora Ltda. Todos os direitos para a lingua portuguesa reservados pela Bditora McGraw-Hill, Ltda, e Makron Books do Brasil Editora Lida. Nenhuma parte desta publicagie podera ser reproduzida, guardada pelo sistema “retrieval” ou transmitida de qualquer modo ou por qualquer outro meio, seja este eletrOnico, mecinico, de fotocépia, de gravagio, ou outros, sem prévia autorizacio, por escrito, das Editoras. EDITOR: MILTON MIRA DE ASSUMPGAO FILHO Produtora Editorial: Joana Figueiredo Produtor Gréfico: José Roberto Petroni Editoragao Eletronica: E.R.J. Informatica Ltda Dados de Catalogagao na Publicagao (CIP) Internacional (Camara Brasileira do Livro, SP, Brasil) Schildt, Herbert C, completo e total - 3! edicgdo revista e atualizada Herbert Schildt ; tradugdéo e revisdéo técnica Roberto Carlos Mayer. Sao Paulo : Makron Books, 1996. rence Titulo original: C: the complete re ISBN 85-346-0595-5 1. C (Linguagem de programagdéo) I. 6-0491 CDD-005.133 indices para catalogo sistematic 1. C : Linguagem de programacdo : Computadores Processamento de dados 005.133 Sumario © Que Ha de Novo Nesta Edicéo Dn XXIV O Que Ha n0 LivIO eccecetesstevtevssevesevestsesess : XXV Parte 1 — A Linguagem C0... 0s. eeeseeeeee sence tence eeeeneaneaee 1 1, Uma Visdo Geral de Co... ce seseeees sence ceca eeeee eens aeeree 3 As Origens de C 3 C E uma Linguagem de Médio Nivel . 5 4 CE uma Linguagem Estruturada ..... venteeeee cee 5 C E uma Linguagem para Programadores 7 Compiladores Versus Interpretadores . . 9 A Forma de um Programa em C ..... sete cee A Biblioteca ea Linkedigado .......... 000000 esceee eer 1 Compilagdo Separada ... 0.6... 06 00sec eve eee eeeeee eee cee 212 Compilando um Programa em C ..... 6.6... 000 eee eeeeeeeeeees se © Mapa de Memoria de C 13 C Versus C++ .. bebe tee et een teeeeee 14 Um Compilador C++ Funcionaré com Programas C? ...... cece D5 Uma Revisdo de Termos eee a eee 2. Expresses EMC... 0... e cece eee cece tenet eee e eee eee ee eee 16 Os Cinco Tipos Basicos de Dados 16 Modificando os Tipos Basicos .. 17 Nomes de Identificadores . 19 Varidveis 0.0000 c ce eeeee cece eeeeee : eo 20 VI C= Completo ¢ Total Onde as Varidveis Sao Declaradas Varidveis Locais Parametros Formais Variaveis Globais ... Modificadores de Tipo de Acesso const . 20 voiatile dores de Tipo de Classe de Armazenamento A Varidveis static : 7 Variaveis register Inicializagao de Variaveis Constantes . . Constantes Hexadecimais e Octais Constantes String Constantes Caractere de Barra Invertida Operadores . O Operador de Atribuicao Conversio de Tipos em Atribuigoes: Atribuigdes Multiplas . Operadores Aritméticos Incremento e Decremento . Operadores Relacionais e Logicos Operadores Bit a Bit O Operador ? .... 5 Os Operadores de Ponteiros & e* .... O Operador em Tempo de Compitacio s O Operador Virgula ... : Os Operadores Ponto () e Seta (>) Parénteses e Colchetes Como Operadores Resumo das Precedéncias Expressdes Ordem de Avaliagao : Conversio de Tipos em Expresses. Casts Espagamento e Parénteses C Reduzido izeof . Comandos de Controle do Programa . Verdadeiro e Falso em C bev eeveeeeseeceeeteevevtreeeees Comandos de Selegio beeteteenee if ifs Aninhados beeecens A Escada if-else-if .... feveeens O? Alternativo. . Sumo vil A Expresso Condicional ...... vec eeeteeeeettte ete t ttt e eee es 69 switch es 70 Comandos switch Aninhados ........0cc0s 0s veceeeeees 74 Comandos de Iteragdo . feetteeeees coven 74 O Lago for eee cece beeen voveeetnee 74, Variacées do Lago for .. teens ee .-76 O Lago Infinito 2... eee cece eee peer - 80 Lagos for sem Corpos pee neneeernrs eee ceceeeee BL O Lago while ee BT O Lace do-while - 84 Comandos de Desvio 85 O Comando return . 285 O Comando goto ... +86 © Comando break . 86 A Funcao exit)... - 88 © Comando continue - 89 Comandos de Expressées : feeee vee 91 Blocos de Comandos ......60066062000000 . cece OL Matrizes @ Strings .... 0.6.6 e cece cece cece eee ee ee teen cree es OD Matrizes Unidimensionais . ..... peer ceee eee 92 Gerando um Ponteiro para uma Matriz ee cece OM Passando Matrizes Unidimensionais para Fungdes .......... 02... cee DM Strings 96 Matrizes Bidimensionais ---98 Matrizes de Strings ...... 102 Matrizes Multidimensionais uG 104 Indexando Ponteiros = 105 Inicializagao de Matriz ..... bee 107 Inicializagao de Matrizes Nao-Dimensionadas ...... pubepnonecdl) Um Exemplo com o Jogo-da-Velha seer : 109 Ponteiros .........++ ee eee Bee eee eee eee eee eer atts) O Que Sao Ponteiros? ......... - pees 5 ceeeeegils) Varidveis Ponteiros settee oe 5 cee IB Os Operadores de Ponteiros ceteee ails Expressdes com Ponteiros 116 Atribuicao de Ponteiros ceeeees voce teteseteeneeeees 116 Aritmética de Ponteiros bocce ttetettteeteeeeeetersereeteeeess 116 Comparagao de Ponteiros . 118 Ponteiros e Matrizes ....... Bboeoneee coe ween 120 Matrizes de Ponteiros .........0....5 cevceee eee : 2121 Indiregao Multipla . ern weveeee 122 Inicializagao de Ponteiros .. : wo 124 Ponteiros para Fungées ... : poe08H ee 126 Vit C — Completo e Total As Fungées de Alocagao Dinamica em C 128 Matrizes Dinamicamente Alocadas 130 Problemas com Ponteiros. 133 L7. Jospocnousoapepbononnsoccodenocondonsupsuopanoonoo0 EL) A Forma Geral de uma Fungdo .....0606022 502+ 138 Regras de Escopo de Fungées ; 5 139 Argumentos de Fungdes . 139 Chamada por Valor, Chamada por Referéncia . 140 Criando uma Chamada por Referéncia 141 Chamando Fungdes com Matrizes 142 argc e argv — Argumentos para main() 147 O Comando return 5 150 Retornando de uma Fungao .. : 150 Retornando Valores .... 152 Fungdes Que Devolvem Valores Nao-Inteiros 154 Prototipos de Fungdes -- 156 Retornando Ponteiros = 158 Fung@es do Tipo void - 159 © Que main) Devolve? - 160 Recursao . 160, Declarando uma Lista de Parametros de Extensio Variavel +162 Declaracao de Parametros de Fungdes Moderna Versus Classica 162 Questdes sobre a Implementacio : - 164 Parametros e Fungoes de Propésite Geral 164 Eficiéncia 164 Bibliotecas e Arquivos v2 165 Arquivos Separados vee 165 Bibliotecas . : 165 De Que Tamanho Deve Ser um Arquivo de Programa? . 166 Estruturas, Unides, Enumeracées e Tipos Definidos pelo Usuario .... 167 Estruturas . 167 Referenciando Elementos de Estruturas 169 Atribuicao de Estruturas 170 Matrizes de Estruturas 171 Um Exemplo de Lista Postal 171 Passando Estruturas para Fungies 179 Passando Elementos de Estrutura para Fungoes . 179 Passando Estruturas Inteiras para Funcées . . 180 Ponteiros para Estruturas cee feces = 182 Declarando um Ponteiro para Estrutura ...... 00.22.22. - 182 Usando Ponteiros para Estruturas .... : : =. 182 Matrizes e Estruturas Dentro de Estruturas 185, Campos de Bits 186 Sumério IX Unides eee eee e eee ee beeen eee . eeeeeeeeee eens Enumeragbes BapaeHo eo! Usando sizeof para Assegurar Portabilidade ........ Beene od typedef Seen eee eter eee eee cee ety o6) B. E/S pelo Console .........e0eeeee eens eee Erneta re aber Lendo e Escrevendo Caracteres eee ee eee roo Um Problema com getchar() ......... 200 Alternativas para getchar() .......... +200 Lendo e Escrevendo Strings .........0605 2201 E/S Formatada pelo Console « beveeveestsseeetteseeerternaeseer ©1203 printf0 5 beceeeteveeeee ees 1.204 Escrevendo Caracteres : sete +205 Escrevendo Niimeros ........ : beceeetee +. 205 Mostrando um Endereco voce vceneteete reese e206 O Especificador fon .....-..-. veveee ee 207 Modificadores de Formato. . beveveeeeee ees 207 O Especificador de Largura Minima de Campos... 0. . = 207 O Especificador de Precisd0 ........00s00ceeecseeeeessesseeseeeess 209 Justificando a Saida....... vette ttttnteeeeeens cece ee 210 Manipulando Outros Tipos de Dados : 210 Os Modificadores * ¢ # 5 210 seanf()........... 2 Especificadores de Formato .......s....5 : 212 Inserindo Nuimeros ..... cee 212 Inserindo Inteiros sem Sinal_ feeteeteettnteeeeeeeseterseee 213 Lendo Caracteres Individuais com sean{).........0000000+ 213 Lendo Strings ... feetevtcnneernens eee 213 Inserindo um Endereco |... 24 O Especificador % occ 215 Utilizando um Scanset 215 Deseartando Espacos em Branco Indesejados . 216 Caracteres de Espaco Nao-Branco na String de Controle .............-..--.216 Deve-se Passar Enderegos para seanf() .......0000c00seecseeeeeeeeeeeersees216 Modificadores de Formato Suprimindo a Entrada 9. E/S com Arq See eee eee ee eee eee Eee ee Teri o) E/S ANSI Versus E/S UNIX ceveeeeseeees cece eee 219 217 218 E/S em C Versus E/S em C++ : : +220 Streams e Arquivos . , : 220 Streams ... : 220 Streams de Texto oo .s.ccss. eee nrrereer en 221 Streams Binérias ..... : beettteeeees 221 Arquivos ...... 1221 C— Completo.e Total Fundamentos do Sistema de Arquivos ..........0000006000ecceceeeeeeeee ee 222 O Ponteiro de Arquivo Bopode . veer 2B Abrindo um Arquivo veces cover e een 224 Fechando um Arquivo sevens fever eee e e225 Escrevendo um Caractere : ; - 226 Lendo um Caractere +226 Usando fopen0), getc(), putc() e fclose() tees +227 Usando feof() . . +228 Trabalhando com Strings: ‘puts e fgets vee 230 TeWINd() 2.0... ccc eeeeeeeeeeeeeeeeteeetseeeeeeteeeetretectterereeseese231 ferror() ....... beet t tt nttreeeeees eee 232 Apagando Arquivos ..........2-00005 ceteees ceceeeee nee 234 Esvaziando uma Stream beeen b ce tnteeteeeteeee tener 235 fread() e fwrite() coven 235 Usando fread() e fwrite) : 5 235 fseek() e E/S com Acesso Aleatério ceceeeeeee e242 fprintf) e fscanf) coven eee MB As Streams Padrao 2245 ‘A Conexio de E/S pelo Console . . 245 Usando freopen() para Redirecionar as Streams Padro.......s...... 246 O Sistema de Arquivo Tipo UNIX ...... feeeeees veeeeee e247 open() fees feet e cet trsneeteeeeeeen ere 1 248 creat() . : . coven 249) close) . sees wees foe cee 249) read() e write() vee ceeeeeeteetteeeeeteeteee rere 250 unlink() : eee veteees 222251 Acesso Aleat6rio Usando Iseek() beet eeeennnneeeeeeeee ees 252 |. © Pré-processador de C e Comentarios .......- 200s eee cere eens 254 O Pré-processador de Co... fees seen 254 define .. vette ete tcvtneeeeeeseeeener ee 0285 Definindo Macros Semelhantes a FungSes....0..0cccccscse beeeeee 1287 #error +258 include : veces 1 . Diretivas de Compilagao Condicional beseeeeeee veeeee e259 Hif, Helse, Helif e #endif ..............005 feeteeecevenrreeeeneesess1259 Hifdef e Hite 00... eeeeee eee fesse 261 #undef .. cove vc tevvsseetesteeteettnereaees 262 Usando defined 263 Hine . ve tet ee tecvttreeeeeteteeteesttttsteteetertreeesersss 2264 fipragma....... fete teteestreeereesenneee sees +264 Os Operadores # © ## do Pré-processador veeetneeeeeeeetee 2+ 264 Nomes de Macros Predefinidas ........2.200c00ccseeseceseeeeeennnsteeees+ +266 Comentarios 00.6... coe cece eee eeeseceneceeeteecteesenet nese oces - 266 Sumdrio XI Parte 2 — A Bibl teca C Padréo 11, Linkedigéo, Bibliotecas e Arquivos de Cabecalho O Linkeditor Compilagdo Separada . Cédigo Relocavel ...... Linkeditando com Overlays Linkeditando com DLLs A Biblioteca C Padrao Arquivos de Biblioteca Versus Arquivos-Objetos . Arquivos de Cabecalho . beeeee Macros em Arquivos de Cabecalho Redefinigdo das Fungées da Biblioteca . 12, Fungoes de E/S.....-... pee eer 13. Fungées de String e de Coracteres ........ 4.065 14, Fungdes Mateméticas ....... 66... cece eee cee eee e eee eee a 15. Fungées de Hora, Data e Outras Relacionadas com o Sistema... 16. Alocagéo Dinémica.......... 6.005 Pee Eee eee eee Cee eereer 17. Fungées Graficas e de Texto .... 60.6 e ee ece ee eee ee eee ent enene 442 18, Fungdes Miscelaneas .............-0--0 06 Seen cece eee eevee .. 472 Parte 3 — Algoritmos e Aplicagées ...... 19. Ordenagéo e Pesquisa .. peer Ordenacao Tipos de Algoritmos de Ordenacao Uma Avaliagio dos Algoritmos de Ordenacao A Ordenagao Bolha — O Deménio das Trocas .. Ordenacao por Selecéo Ordenacao por Insergio Ordenagées Melhores Ordenacao Shell Quicksort Escolhendo uma Ordenagao Ordenando Outras Estruturas de Dados Ordenagao de Strings ....... Ordenacao de Estruturas : Ordenando Arquivos de Acesso Aleatorio em Disco Pesquisa . Métodos de Pesquisa xi C—Completo e Total Pesquisa Seqiiencial feet coer BBB Pesquisa Bindtia - eee 23 20. Filas, Pilhas, Listas Encadeadas e Arvores Bindrias .............. 525 Fila oo... fee tteeeee oe - 526 A Fila Circular... vevceeeees ve 531 Pilhas bette teteeee serene Sas) Listas Encadeadas Hoobddnb popun0606 540 Listas Singularmente Encadeadas Listas Duplamente Encadeadas Um Exemplo de Lista Postal Arvores Bindrias . 21. Matrizes Esparsas ...... ‘A Matriz Esparsa com Lista Encadeada da Abordagem com Lista Encadeada | A Abordagem com Arvore Binaria para Matriz Esparsa Anélise da Abordagem com Arvores Binétias ‘A Abordagem com Matriz de Ponteiros para Matriz Esparsa Andlise da Abordagem com Matriz de Ponteiros de Hashing ... Escolhendo uma Abordagem . 22, Andlise de Expressées e Avaliagao ........+- Expressdes : Dissecando uma Expressio Anilise de Expressio .. : Um Analisador Simples de Expressdes Acrescentando Variaveis ao Analisador . Verificagao de Sintaxe em um Analisador Recursive Descendente 23. Solucdo de Problemas de Inteligéncia Artifical ........ Representacao ¢ Terminologia Explosies Combinatorias Técnicas de Pesquisa Avaliagao das Pesquisas Uma Representacao Grafica : A Pesquisa de Profundidade Primeiro .. i Uma Analise da Pesquisa de Profundidade Primeiro .. A Pesquisa de Extensdo Primeiro .... sees Uma Anidlise da Pesquisa de Extenso Primeiro Adicionando Heuristicas . A Pesquisa da Escalada da Montanha Anélise da Escalada da Montanha Sumario Xi A Pesquisa por Menor Esforgo ee vette bee 635) Andlise da Pesquisa por Menor Esforgo feet tenet n ee ee terre 636 Escolhendo uma Técnica de Pesquisa cece eee 637 Encontrando Multiplas Solugdes » 637 526 Remogao de Percurso eee eee 638 Remogao de NO . : 639 Encontrando a Solucéo Ideal 645 De Volta as Chaves Perdidas ... votes 651 24. Construindo o Esqueleto de um Programa Windows 95 ........... 655 A Perspectiva da Programagao Windows 95 ; = 656 O Modelo da Mesa de Trabalho . : ++ 656 O Mouse .......ceeeeeeeerreeeee betes cree e687 [cones e Mapas de Bits 657 Menus, Barras de Ferramentas, Barras de Status e Caixas de Didlogo 657 Como Windows 95 e Seu Programa Interagem 658 Windows 95 Usa Multitarefa Preemptiva 659 A API Win32: A API de Windows 95 ....... 659 Os Componentes de uma Janela ...... : : cee 660 Nocées Basicas sobre Aplicagées Windows 95. -661 WinMain() . . wee eee eee . . 661 A Fungao de Janela.........0000ccsevveseee veeees cece 662 Classes de Janelas 00.0.0... 662 A Repeticio de Mensagens . on 663 Os Tipos de Dados Windows .. ao 663 Um Esqueleto Windows 95 664 Definindo a Classe de Janela 667 Criando uma Janela 669 A Repeticio de Mensagens 671 A Fungao de Janela feeetevereeteteeteeteessrerses e673 Usando um Arquivo de Definicao Serene peeeereer Oc Convenes sobre Nomes 0... .....:::ccceeeee feeee eee 674 Parte 4 — Desenvolvimento de Software Usando C............00+4++ 677 25. Interfaceamento com Rotinas em Linguagem Assembly ........... 679 Interface com a Linguagem Assembly ...... : 679 As Convengdes de Chamada de um Compilador C 681 ‘As Convengdes de Chamada do Microsoft C/C++ 681 Criando uma Fungao em Cédigo Assembly +683 Uma Fungao Simples em Cédigo Assembly 683 Um Exemplo de Chamada por Referéncia 688 Utilizando 0 Modelo de Meméria Grande para Dados Codigo 690 Criando um Esqueleto de Cédigo Assembly ............5 ves 692 xiv C— Completa ¢ Total ‘Usando asm 7 = 694 Quando Codificar em Assembler. - 695 26. Engenharia de Software Usando C .... 6... cece cece eee s OIF Projeto em Top-DOWN 2.0... 000.2 00 eeeeeeeeee eee oo Delineando Seu Programa cee 698 Escolhendo uma Estrutura de Dados . .. 699 Fungoes a Prova de Bala .........- 700 Usando MAKE . 703 Usando Macros com MAKE cet eetteeeee ees 707 Usando um Ambiente Integrado de Desenvolvimento 708 , Portabilidade e Depuragao .......... 66.0.6. 05 ++ 710 710 Os Operadores de Incremento ¢ Decremento seteteeeeteeeeereee TIT Utilizando Variaveis em Registradores .............. 712 Ponteiros Versus Indexagao de Matrizes .......... 715 Uso de Fungées 716 Programas Portavei .720 Usando #define beens see . 1 72D Dependéncias do Sistema Operacional «0.0... .s..-. 721 Diferencas no Tamanho dos Dados ; 722 Depuragéo 723 Erros de Ordem de Processamento . 1 7B Problemas com Ponteiros .. 2.724 Erros Bizarros de Sintaxe ..............4... eee wes 726 Erros por Um ... 727 Erros de Limites . -728 Omissio de Prototipo de Funcio. 729 Erros de Argumentos 730 Colisées entre a Pilha eo Heap . 731 Teoria Geral de Depuragio 731 A Arte da Manutencao de Programas ............... 1733 Consertando Erros oe 733 Protegao do Cédigo-Fonte -734 Parte 5 — Unt Interpretador ©... 2... .ccc eee eceee ence eee enees 737 28, Interpretadores C...... 6c cece cece e eee ens ees eee e ene e ens 139 A Importancia Pratica dos Interpretadores ... See 740 A Especificagio de Little C i -7AL Uma Restricao Importante de Little C ...... 742 Interpretando uma Linguagem Estruturada 743 Uma Teoria Informal de C 744 Expressées C 745 Sumério xv Avaliando Expresses ....... 00000. 0e cece cee e eee eee ee eee eens 746 © Analisador de Express6es ... bevtecerseeee 747 Reduzindo 0 Cédigo-Fonte a Seus Componentes... : 748 Analisador Recursivo Descendente Little C : 755 Interpretador Little C 7 768 A Varredura Prévia do Interpretador . fetet tees 769 A Fungao Main0 een bectetsneeeeeeteertrceensnssT22 A Funcao Interp block ......0000c0cccseceeeeee eee veveeeree 7B Tratando Varidveis Locais 789 Chamando Fungdes Definidas pelo Usuario cect e ete ceree eee ee ees 2 790 Atribuindo Valores a Varidveis vee ee 794 Executando um Comando if ......600c00c0cceeeeeeeeeeevsssseeeeeeesees 20795 Processando um Lago While .....00000000000¢00000cerereeeees 2.79 Processando um Lago Do-While ............ beeteeeees 797 O Lago for eens 798 Fungdes da Biblioteca Little C . feeee eee etr ere e es 799 Compilando e Linkeditando o Interpretador Little Co... es scceceesess 1803 Demonstrando Little Co... ...ecceecccsessseeseeeseeceerenssaeeeeesee ss 1804 Melhorando Little Co... 0... ...eceeeecceesseeeeseeseeeeneeenes 807 Expandindo Little C........ en 809 Adicionando Novos Recursos de Cs... 809 Adicionando Recursos Auxiliares sete eee . 810 indice Analitico . MAKRON Books Parte 1 A Linguagem C A primeira parte deste livro apresenta uma discussao completa da linguagem de programacao C. O Capitulo 1 fornece uma rapida exposicao da linguagem C — o programador mais experiente talvez queira passar diretamente para o Capitulo 2. O Capitulo 2 examina os tipos de dados internos, varidveis, operadores e expressées. O Capitulo 3 apresenta os comandos de controle do programa. O Capitulo 4 discute matrizes e strings. O Capitulo 5 trabalha com ponteiros. O Capitulo 6 discute funcdes. O Capitulo 7 aborda estruturas, unides 0s tipos definidos pelo usuario. O Capitulo 8 examina as E/S pelo console. O Capitulo 9 aborda as E/S de arquivo e, finalmente, 0 Capitulo 10 discute o pré-processador e faz comentarios. O assunto desta parte (e a maior parte do material deste livro) reflete 0 padrao ANSI para C. No entanto, o padrao original de C, oriundo do UNIX versio 5, também é focalizado, e as diferencas mais importantes sao salientadas. O livro aborda tanto o C ANSI quanto o original como garantia de que vocé encontrara informagées pertinentes ao seu ambiemte de programagao em C. ‘iste Uma Visao Geral de C Se A finalidade deste capitulo é apresentar uma visao geral da linguagem de pro- gramagao C, suas origens, seus usos e sua filosofia. Este capitulo destina-se prin- cipalmente aos novatos em C. Biaso igens de C A linguagem C foi inventada e implementada primeiramente por Dennis Ritchie em um DEC PDP-11 que utilizava o sistema operacional UNIX. C é 0 resultado de um processo de desenvolvimento que comegou com uma linguagem mais antiga, chamada BCPL, que ainda esta em uso, em sua forma original, na Europa. BCPL foi desenvolvida por Martin Richards e influenciou uma linguagem cha- mada B, inventada por Ken Thompson. Na década de 1970, B levou ao desen- volvimento de C. Por muitos anos, de fato, o padrao para C foi a versdo fornecida com 0 sistema operacional UNIX versao 5. Ele é descrito em The C Programming Lan- guage, de Brian Kernighan e Dennis Ritchie (Englewood Cliffs, N.J.: Prentice Hall, 1978). Com a popularidade dos microcomputadores, um grande ntimero de im- plementacoes de C foi criado. Quase que por milagre, os cdigos-fontes aceitos por essas implementacées eram altamente compativeis. (Isto é, um programa escrito com um deles podia normalmente ser compilado com sucesso usando-se um outro.) Porém, por nao existir nenhum padrao, havia discrepancias. Para remediar essa situagao, o ANSI (American National Standards Institute) estabe- leceu, no vero de 1983, um comité para criar um padrao que definiria de uma vez por todas a linguagem C. No momento em que esta obra foi escrita, 0 comité 4 C—Completo e Total Cap. 1 do padrao ANSI estava concluindo 0 processo formal de adogao. Todos os prin- cipais compiladores C j4 implementaram 0 padrao C ANSI. Este livro aborda totalmente o padrao ANSI e enfatiza-o. Ao mesmo tempo, ele contém informa- cOes sobre a antiga versio UNIX de C. Em outras palavras, independentemente do compilador que esteja usando, vocé encontrar assuntos aplicdveis aqui. @ cE uma L nguagem de Meédio Nivel C ¢ freqiientemente chamada de linguagem de médio nivel para computadores. Isso nao significa que C seja menos poderosa, dificil de usar ou menos desen- volvida que uma linguagem de alto nivel como BASIC e Pascal, tampouco implica que C seja similar a linguagem assembly e seus problemas correlatos aos usua- ios. C é tratada como uma linguagem de médio nivel porque combina elementos: de linguagens de alto nivel com a funcionalidade da linguagem assembly. A Ta- bela 1.1 mostra como C se enquadra no espectro das linguagens de computador. Tabela 1.1. A posicéo de C no mundo das linguagens. Nivel mais alto Ada Medula-2 Pascal COBOL FORTRAN BASIC Médio nivel CH c FORTH Macro-assembler Nivel mais baixo Assembler Como uma linguagem de médio nivel, C permite a manipulagao de bits, bytes e enderecos — os elementos basicos com os quais 0 computador funciona. Um cédigo escrito em C é muito portavel. Portabilidade significa que é possivel adaptar um software escrito para um tipo de computador a outro. Por exemplo, se vocé pode facilmente converter um programa escrito para DOS de tal forma a executar sob Windows, entao esse programa é portavel. Todas as linguagens de programagio de alto nivel suportam 0 conceito de tipos de dados. Um tipo de dado define um conjunto de valores que uma varidvel pode armazenar e 0 conjunto de operacdes que pode ser executado com Cap. 1 Uma visto geral de C wo essa varidvel. Tipos de dados comuns sao inteiro, caractere ¢ real. Embora C tenha cinco tipos de dados internos, ela nao ¢ uma linguagem rica em tipos de dados como Pascal e Ada. C permite quase todas conversdes de tipos. Por exem- plo, os tipos caractere e inteiro podem ser livremente misturados na maioria das expressdes. C nao efetua nenhuma verificacao no tempo de execugao, como a validacao dos limites das matrizes. Esses tipos de verificacdes sao de responsa- bilidade do programador. As vers6es originais de C nao realizavam muitos (se é que realizavam algum) testes de compatibilidade entre um parametro de uma funcao e 0 argu- mento usado para chamar a funcao. Por exemplo, na versao original de C, vocé poderia chamar uma funcdo, usando um ponteiro, sem gerar uma mensagem de erro, mesmo que essa fungao tivesse sido definida, na realidade, como recebendo um argumento em ponto flutuante. No entanto, 0 padrao ANSI introduziu o conceito de protdtipos de fungdes, que permite que alguns desses erros em potencial sejam mostrados, conforme a intengao do programador. (Prototipos serao discu- tidos mais tarde no Capitulo 6.) Outro aspecto importante de C é que cle tem apenas 32 palavras-chaves (27 do padrao de fato estabelecido por Kernighan e Ritchie, mais 5 adicionadas pelo comité ANSI de padronizacao), que sao os comandos que compoem a lingua- gem C. As linguagens de alto nivel tipicamente tém varias vezes esse numero de palavras reservadas. Come comparacao, considere que a maioria das versdes de BASIC possuem bem mais de 100 palavras reservadas! @ cE uma Linguagem Estruturada Embora 0 termo linguagem estruturada em blocos nao seja rigorosamente aplicavel aC, ela é normalmente referida simplesmente como linguagem estruturada. C tem muitas semelhancas com outras linguagens estruturadas, como ALGOL, Pascal e Modula-2. KN NOTA: A razio pela qual C nao &, tecnicamente, uma linguagem estruturada em =” locos, é que as linguagens estruturadas em blecos permitem que procedimentos e fungées sejam declarados dentro de procedimentos e fungées. No entanto, como C nio permite a criagto de fungdes dentro de fungoes, niio pode ser chamada formal mente de uma linguagem estruturada em blocos. A caracteristica especial de uma linguagem estruturada é a compartimen- talizagdo do cédigo e dos dados. Trata-se da habilidade de uma linguagem seccionar e esconder do resto do programa todas as informacées nece: rias para se realizar uma tarefa especifica. Uma das maneiras de conseguir 6 ‘C — Complete e Total Cap. 1 essa compartimentalizacao é pelo uso de sub-rotinas que empregam varidveis locais (temporarias). Com 0 uso de variaveis locais é possivel escrever sub-rotinas de forma que os eventos que ocorrem dentro delas ndo causem nenhum efeito inesperado nas outras partes do programa. Essa capacidade permite que seus programas em C compartilhem facilmente secdes de cédigo. Se vocé desenvolve fungdes compartimentalizadas, so precisa saber 0 que uma fungao faz, nao como ela faz. Lembre-se de que 0 uso excessivo de variaveis globais (variaveis conhe- cidas por todo o programa) pode trazer muitos erros, por permitir efeitos cola- terais indesejados. (Qualquer um que ja tenha programado em BASIC esté bem ciente deste problema.) Uma linguagem estruturada permite muitas possibilidades na progra- magao. Ela suporta, diretamente, diversas construgdes de lagos (loops), como while, do-while e for. Em uma linguagem estruturada, 0 uso de goto é proibido ou desencorajado e também a forma comum de controle do programa, (que ocorre em BASIC e FORTRAN, por exemplo). Uma linguagem estruturada permite que voc insira sentengas em qualquer lugar de uma linha e nao exige um conceito rigoroso de campo (como em FORTRAN). A seguir estao alguns exemplos de linguagens estruturadas e nao estru- turadas. Nao estruturadas Estruturadas FORTRAN Pascal BASIC Ada COBOL, CH e Modula-2 Linguagens estruturadas tendem a ser modernas. De fato, a marca de uma linguagem antiga de computador é nao ser estruturada. Hoje, a maioria dos programadores considera as linguagens estruturadas mais faceis de programar e fazer manutencao. O principal componente estrutural de C é a fungdo — a sub-rotina iso- lada de C. Em C, funcées sao os blocos de construgéo em que toda a atividade do programa ocorre. Elas admitem que vocé defina e codifique separadamente as diferentes tarefas de um programa, permitindo, entdo, que seu programa seja modular. Apés uma fungéo ter sido criada, vocé pode esperar que ela trabalhe adequadamente em varias situacOes, sem criar efeitos inesperados em outras par- tes do programa. O fato de vocé poder criar fungGes isoladas é extremamente importante em projetos maiores nos quais um cddigo de um programador nao deve afetar acidentalmente o de outro. Cap. 1 ‘Uma visto gerat de C 7 Uma outra maneira de estruturar e compartimentalizar 0 cédigo em C é pelo uso de blocos de cddigo. Um bloco de cédigo é um grupo de comandos de programa conectado logicamente que é tratado como uma unidade. Em C, um bloco de cédigo ¢ criado colocando-se uma seqiiéncia de comandos entre chaves. Neste exemplo, if (x < 10) { printf ("muito baixo, tente novamente\n") ; scanf("%d", &x); } os dois comandos apés 0 if ¢ entre chaves sao executados se x for menor que 10. Esses dois comandos, junto com as chaves, representam um bloco de cédigo. Eles sao uma unidade légica: um dos comandos nao pode ser executado sem que © outro também seja. Atente para o fato de que todo comando em C pode ser um comando simples ou um bloco de comandos. Blocos de cédigo permitem que muitos algoritmos sejam implementados com clareza, elegancia e eficiéncia. Além disso, eles ajudam o programador a conceituar a verdadeira natureza da rotina. @ ce uma Linguagem para Programadores Surpreendentemente, nem todas as linguagens de computador sao para progra- madores. Considere os exemplos classicos de linguagens para nao-programado- res: COBOL e BASIC. COBOL nao foi destinada para facilitar a vida do progra- mador, aumentar a seguranca do cédigo produzido ou a velocidade em que o cédigo pode ser escrito. Ao contrario, COBOL foi concebida, em parte, para per- mitir que nao-programadores leiam e presumivelmente (embora isso seja impro- vavel) entendam o programa. BASIC foi criada essencialmente para permitir que nao-programadores programem um computador para resolver problemas relati- vamente simples. Em contraposicao, C foi criada, influenciada e testada em campo por programadores profissionais. O resultado final é que C dé ao programador o que ele quer: poucas restrig6es, poucas reclamacées, estruturas de bloco, fungdes isoladas e um conjunto compacto de palavras-chave. Usando C, um programador pode conseguir aproximadamente a eficiéncia de cédigo assembly combinada com a estrutura de ALGOL ou Modula-2, Nao é de admirar que C seja trangiii- lamente a linguagem mais popular entre excelentes programadores profissionais. 8 C— Completo e Total Cap. 1 O fato de C freqiientemente ser usada em lugar da linguagem assembly 6 0 fator mais importante para a sua popularidade entre os programadores. A linguagem assembly usa uma representagao simbélica do cédigo binario real que o computador executa diretamente. Cada operacao em linguagem assembly leva a uma tarefa simples a ser executada pelo computador. Embora a linguagem assembly dé aos programadores 0 potencial de realizar tarefas com maxima fle- xibilidade e eficiéncia, é notoriamente dificil de trabalhar quando se esta desen- volvendo ou depurando um programa. Além disso, como assembly nao é uma linguagem estruturada, o programa final tende a ser um cédigo “espaguete” — um emaranhado de jumps, calls e indices. Essa falta de estrutura torna os pro gramas em linguagem assembly dificeis de ler, aperfeicoar e manter. Talvez ma importante: as rotinas em linguagem assembly nao sao portaveis entre maquinas com unidades centrais de processamento (CPUs) diferentes. Inicialmente, C era usada na programacio de sistema. Um programa de istema forma uma porcao do sistema operacional do computador ou de seus utilitarios de suporte. Por exemplo, os programas que seguem sao freqiientemen- te chamados de programas de sistema Sistemas operacionais Interpretadores Editores Programas de planilhas eletronicas Compiladores ™ Gerenciadores de banco de dados Em virtude da sua portabilidade e eficiéncia, a medida que C cresceu em popularidade, muitos programadores comecaram a usé-la para programar todas as tarefas. Por haver compiladores C para quase todos os computadores, é possivel tomar um cédigo escrito para uma maquina, compilé-lo e rodé-lo em outra com pouca ou nenhuma modificacao. Esta portabilidade economiza tempo e dinheiro. Os compiladores C também tendem a produzir um cédigo-objeto muito compacto e rapido — menor e mais rapido que aquele da maioria dos compiladores BASIC, por exemplo. Além disso, os programadores usam C em todos os tipos de trabalho de programacao porque eles gostam de C! Ela oferece a velocidade da linguagem assembly e a extensibilidade de FORTH, mas poucas das restricdes de Pascal ow Modula-2, Cada programador C pode, de acordo com sua propria personalidade, criar e manter uma biblioteca tinica de fungdes customizadas, para ser usada em muitos programas diferentes. Por admitir — na verdade encorajar — a compi- lacao separada, C permite que os programadores gerenciem facilmente grandes projetos com minima duplicacao de esforco. Cap. 1 Uma visiio geral de C 9 @ Compiladores Versus Interpretadores Os termos compiladores e interpretadores referem-se & maneira como um programa é executado. Existem dois métodos gerais pelos quais um programa pode ser executado. Em teoria, qualquer linguagem de programagio pode ser compilada ou interpretada, mas algumas linguagens geralmente sao executadas de uma ma- neira ou de outra. Por exemplo, BASIC é normalmente interpretada e C, compi- lada (especialmente no auxilio 4 depuragao ou em plataformas experimentais como a desenvolvida na Parte 5). A maneira pela qual um programa é executado nao é definida pela linguagem em que ele é escrito. Interpretadores e compiladores sao simplesmente programas sofisticados que operam sobre o cédigo-fonte do seu programa. Como a diferenca entre um compilador e um interpretador pode nao ser Clara para todos os leitores, a breve descricao seguinte esclareceré o assunto. Um interpretador lé 0 cédigo-fonte do seu programa uma linha por vez, executando a instrugdo especifica contida nessa linha. Um compilador lé pro- grama inteiro e converte-o em um cédigo-objeto, que é uma tradugio do cédigo- fonte do programa em uma forma que 0 computador possa executar diretamente. cédigo-objeto é também conhecido como cédigo bindrio ou cédigo de maquina Uma vez que o programa tenha sido compilado, uma linha do cédigo-fonte, mesmo alterada, nao é mais importante na execucao do seu programa. Quando um interpretador 6 usado, deve estar presente toda vez que vocé executar o seu programa. Por exemplo, em BASIC vocé precisa primeiro executar © interpretador, carregar seu programa e digitar RUN cada vez que quiser usé-lo. O interpretador BASIC examina seu programa uma linha por vez para correcao e entSo executa-o. Esse processo lento ocorre cada vez que o pro- grama for executado. Um compilador, ao contrario, converte seu programa em um cédigo-objeto que pode ser executado diretamente por seu computador. Como © compilador traduz seu programa de uma s6 vez, tudo 0 que vocé precisa fazer 6 executar seu programa diretamente, geralmente apenas digitando seu nome. Assim, o tempo de compilacao sé é gasto uma vez, enquanto o cédigo interpre- tado incorre neste trabalho adicional cada vez que o programa executa. I A Forma de um Programa em C A Tabela 1.2 lista as 32 palavras-chave (ou palavras reservadas) que, combinadas com a sintaxe formal de C, formam a linguagem de programagio C. Destas, 27 foram definidas pela versdo original de C. As cinco restantes foram adicionadas pelo comité ANSI: enum, const, signed, void e volatile. 10 C— Completo e Total Cap. 1 Tabela 1.2 Uma lista das palavras-chave de C ANSI. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Além disso, muitos compiladores C acrescentaram diversas palavras- chave para explorar melhor a organizacio da meméria da familia de processa- dores 8088/8086, que suporta programacado interlinguagens ¢ interrupcoes. Aqui 6 mostrada uma lista das palavras-chave estendidas mais comuns: asm _cs ds es _ss cdecl far huge interrupt near pascal Seu compilador pode também suportar outras extensdes que ajudem a aproveitar melhor seu ambiente especifico. Todas as palavras-chave de C sao miniisculas. Em C, maitisculas e mi- ntisculas sao diferentes: else 6 uma palavra-chave, mas ELSE nao. Uma palavra- chave nao pode ser usada para nenhum outro propésito em um programa em C — ou seja, ela nao pode servir como uma varidvel ou nome de uma funcao. Todo programa em C consiste em uma ou mais fungdes. A tinica funcao que necessariamente precisa estar presente 6a denominada mainQ, que é a pri- meira funcao a ser chamada quando a execugao do programa comeca. Em um cédigo de C bem escrito, main() contém, em esséncia, um esboco do que o pro- grama faz. O esboco é composto de chamadas de funcdes. Embora main) nao seja tecnicamente parte da linguagem C, trate-a como se fosse. Nao tente usar main() como nome de uma variavel porque provavelmente confundira 0 com- pilador. A forma geral de um programa em C é ilustrada na Figura 1.1, onde £10 até £NQ representam fungoes definidas pelo usuario. Cop. 1 Uma bisito geval de C n declaragées globais tipo devolvide main(1i ( seqiiéncia de comandos } ta de parametros) tipo devolvido f1(lista de parametros) { seqgilénci } de comandos tipo devolvido £2(lista de pardmetros) { seqiiéncia de comandos } tipo devolvido £NW(lista de parametros) { Figura 1.1 A forma geral de um programa em C. Hf A Biblioteca e a Linkedigao Tecnicamente falando, é possivel criar um programa ttil e funcional que consista apenas nos comandos realmente criados pelo programador. Porém, isso ¢ muito raro porque C, dentro da atual definigao da linguagem, nao oferece nenhum método de executar operagies de entrada /saida (E/S). Como resultado, a maioria dos pro- gyamas inclui chamadas a varias fungdes contidas na biblioteca C padrao. Todo compilador C vem com uma biblioteca C padrao de fungées que realizam as tarefas necessérias mais comuns. O padrao C ANSI especifica 0 con- junto minimo de fungdes que estard contido na biblioteca. No entanto, seu com- pilador provavelmente conter4 muitas outras funcées. Por exemplo, 0 padrao C ANSI nao define nenhuma funcao grafica, mas seu compilador provavelmente inclui alguma. Em algumas implementacées de C, a biblioteca aparece em um grande arquivo; em outras, ela esta contida em muitos arquivos menores, uma organi- zagdo que aumenta a eficiéncia e a praticidade. Porém, para simplificar, este livro usa a forma singular em referénca a biblioteca. 2 C= Completo e Total Cap. Os implementadores do seu compilador C jf escreveram a maioria das fungées de propésito geral que voce usara. Quando chama uma fungao que nao faz parte do programa que vocé escreveu, o compilador C “memoriza” seu nome. Mais tarde, o linkeditor (linker) combina 0 cédigo que vocé escreveu com 0 c6- digo-objeto ja encontrado na biblioteca padrao. Esse processo é chamado de fin- kedicao. Alguns compiladores C tém seu proprio linkeditor, enquanto outros usam © linkeditor padrao fornecido pelo seu sistema operacional As funges guardadas na biblioteca estdo em formato relocdvel. Isso nifica que os enderecos de memoria das varias instrugdes em cédigo de maquina nao estao absolutamente definidos — apenas informacoes relativas s40 guarda- das. Quando seu programa é linkeditado com as fungées da biblioteca padrao, esses enderecos relativos sao utilizados para criar os enderecos realmente usados. Hi diversos manuais ¢ livros técnicos que explicam esse processo com mais de- talhes. Contudo, vocé nao precisa de nenhuma informagio adicional sobre 0 pro- cesso real de relocagio para programar em C. Muitas das fungdes de que vocé precisaré ao escrever seus programas estao na biblioteca padrao. Elas agem como blocos basicos que vocé combina. Se escreve uma funcao que usaré muitas vezes, vocé também pode colocé-la em uma biblioteca. Alguns compiladores permitem que vocé coloque sua funcdo na biblioteca padrao; outros exigem a criagdo de uma biblioteca adicional. De qual- quer forma, o cédigo estar la para ser usado repetidamente. Lembre-se de que 0 padrao ANSI apenas especifica uma biblioteca pa- drao minima. A maioria dos compiladores fornece bibliotecas que contém muito mais fungdes que aquelas definidas pelo ANSI. Além disso, algumas funcdes encontradas na versao original de C para UNIX nao sao definidas pelo padrao ANSI por serem redundantes. Este livro aborda todas as funcées definidas pelo ANSI como também as mais importantes e largamente usadas pelo padrao C UNIX antigo. Ele também examina diversas fungdes muito usadas, mas que nado sao definidas pelo ANSI nem pelo antigo padrao UNIX. (Fungées nao-ANSI serao indicadas para evitar confusac.) @ Compilagao Separada Muitos programas curtos de C estio completamente contidos em um arquivo- fonte. Contudo, quando o tamanho de um programa cresce, também aumenta seu tempo de compilacao (e tempos de compilacao longos contribuem para pa- ciéncias curtas!). Logo, C permite que um programa seja contido em muitos ar- quivos e que cada arquivo seja compilado separadamente. Uma vez que todos 08 arquivos estejam compilados, eles sao linkeditados com qualquer rotina de Cap. 1 Uma visio geral de C 3 biblioteca, para formar um cédigo-objeto completo. A vantagem da compilacdo separada que, se houver uma mudanca no cédigo de um arquivo, nao sera necessaria a recompilagdo do programa todo. Em tudo, menos nos projetos mais simples, isso economiza um tempo considerdvel. (Estratégias de compilagao se- parada sao abordadas em detalhes na Parte 4.) a Compilando um Programa em C Compilar um programa em C consiste nestes trés passos: 1. Criar o programa 2. Compilar o programa 3. Linkeditar o programa com as fungées necessarias da biblioteca Alguns compiladores fornecem ambientes de programagao integrados que incluem um editor. Com outros, € necessario usar um editor separado para criar seu programa. Os compiladores s6 aceitam a entrada de arquivos de texto padrao. Por exemplo, seu compilador nao aceitaré arquivos criados por certos processadores de textos porque eles tém cédigos de controle e caracteres nao- imprimiveis. O método exato que vocé utiliza para compilar um programa depende do compilador que esta em uso. Além disso, a linkedicao varia muito entre os compiladores e os ambientes. Consulte seu manual do usudrio para detalhes. Ho Mapa de Meméria de C Um programa C compilado cria e usa quatro regides, logicamente distintas na mem6ria, que possuem fungdes especificas. A primeira regido é a memoria que contém 0 cédigo do seu programa. A segunda é aquela onde as variaveis globais sao armazenadas. As duas regides restantes sao a pilha eo “heap”. A pilha tem diversos usos durante a execugao de seu programa. Ela possui 0 endereco de retorno das chamadas de fungao, argumentos para funcGes e varidveis locais, Ela também guarda o estado atual da CPU. O heap é uma regido de meméria livre que seu programa pode usar, via fungdes de alocagdo dinamica de C, em apli- cagdes como listas encadeadas e arvores. A disposicao exata de seu programa pode variar de compilador para compilador e de ambiente para ambiente. Por exemplo, a maioria dos compila- dores para a familia de processadores 8086 tem seis maneiras diferentes de or- 4 C~Completo e Total Cap. 1 ganizar a meméria em razao da arquitetura segmentada de meméria do 8086, Os modelos de meméria da familia de processadores 8086 sao discutidos mais adiante neste livro. Embora a disposicao fisica exata de cada uma das quatro regides possa diferir entre tipos de CPU e implementacées de C, 0 diagrama da Figura 1.2 mostra conceitualmente como seu programa aparece na meméria. Pilha | | Heap Varidveis Globais ‘Cédigo do Programa Figure 1.2, Um mapa conceituat de meméria de um programa em C. WC Versus C++ Antes de concluir este capitulo, 6 necessério dizer algumas palavras sobre C++. Algumas vezes os novatos confundem o que é C++ e como difere de C. Para ser breve, C++ é uma versao estendida e melhorada de C que é projetada para su- portar programagao orientada a objetos (OOP, do inglés Object Oriented Pro- gramming). C++ contém e suporta toda a linguagem C e mais um conjunto de extensdes orientadas a objetos. (Ou seja, C++ é um superconjunto de C.) Como C++ 6 construida sobre os fundamentos de C, vocé nao pode programar em C++ se nao entender C. Portanto, virtualmente todo o material apresentado neste livro aplica-se também a C++. 4 NOTA: Para uma descricdo completa da linguagem C++ veja 0 livro, C++ — The

Você também pode gostar