wikilivros linguagem c

Upload: wesker2010

Post on 01-Jun-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/9/2019 WikiLivros Linguagem C

    1/125

    Programar em C

  • 8/9/2019 WikiLivros Linguagem C

    2/125

    Contedo

    1 Programar em C/Capa 1

    2 Programar em C/Por que aprender a linguagem C 2

    3 Programar em C/Histria da linguagem C 33.1 Histria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    3.1.1 Desenvolvimentos iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.1.2 C de K&R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.1.3 Os Padres C ANSI e C ISO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.1.4 C99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.1.5 Resumo em ingls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    4 Programar em C/Pr-requisitos 64.1 Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    4.2 Compilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.3 Ligador ou linker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.4 Obtendo um compilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.5 Links externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    5 Programar em C/Utilizando um compilador 85.1 Compiladores: viso geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85.2 gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85.3 Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    6 Programar em C/Noes de compilao 106.1 Compilao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106.2 Etapas da compilao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    7 Programar em C/Um programa em C 117.1 Um programa em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117.2 Compilando o programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    7.2.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    8 Programar em C/Conceitos bsicos 138.1 Estrutura bsica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    i

  • 8/9/2019 WikiLivros Linguagem C

    3/125

    ii CONTEDO

    8.1.1 Escopo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138.2 Introduo s funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138.3 Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148.4 Comentrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    9 Programar em C/Variveis 159.1 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159.2 Declarando variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159.3 Atribuindo valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159.4 Exemplo de erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159.5 Nomes de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    10 Programar em C/Tipos de dados 1710.0.1 Explicando bits e bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1710.0.2 Nmeros inteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1710.0.3 Nmeros de ponto utuante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1810.0.4 Bool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1910.0.5 Endereos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1910.0.6 Compatibilidade de dados na atribuio de valor . . . . . . . . . . . . . . . . . . . . . . . 1910.0.7 Converter um tipo de varivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2010.0.8 Literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    11 Programar em C/Constantes 21

    11.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2111.2 DEFINED CONSTANTS (#DEFINE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2111.3 Declared constants (const) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    12 Programar em C/Entrada e sada simples 2312.1 Entrada e sada simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2312.2 puts() e putchar() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2312.3 printf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    12.3.1 Especicaes de formato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    12.3.2 Sequncias de escape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2612.4 scanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    12.4.1 Valor de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2712.5 gets() e getchar() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2712.6 sprintf() e sscanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    13 Programar em C/Operaes matemticas (Bsico) 2913.1 Operaes matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    13.1.1 Abreviaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    14 Programar em C/Operaes matemticas (Avanado) 3114.1 Funes Trigonomtricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

  • 8/9/2019 WikiLivros Linguagem C

    4/125

    CONTEDO iii

    14.1.1 As funes acos e asin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3114.1.2 As funes atan e atan2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3114.1.3 As funes cos, sin e tan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    14.2 Funes Hiperblicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    14.3 Funes Exponencial e Logaritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3214.3.1 A funo exp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3214.3.2 As funes frexp, ldexp e modf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3214.3.3 As funes log e log10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    14.4 Funes pow e sqrt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3214.4.1 As funes pow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3214.4.2 As funes sqrt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    14.5 Funes de Arredondamento para Nmeros Inteiros, Valores Absolutos e Resto da Diviso . . . . . 3214.5.1 As funes ceil e oor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    14.5.2 As funes fabs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3214.5.3 As funes fmod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    14.6 Ligaes externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    15 Programar em C/Operadores 3415.1 Operadores Aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3415.2 Precedncia de Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3415.3 type casting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3415.4 Expoentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    15.5 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3415.6 Precedncia dos operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3515.7 Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3515.8 Precedncia Operadores lgicos e Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3515.9 Operadores Lgicos Bit a Bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    15.9.1 Deslocamento de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3515.10Todos os Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3515.11Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    16 Programar em C/Controle de uxo 3716.1 Controle de uxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3716.2 Expresses de condio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3716.3 Testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    16.3.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3816.3.2 switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3816.3.3 Operador ternrio "?:" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    16.4 Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3916.4.1 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3916.4.2 do ... while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3916.4.3 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

  • 8/9/2019 WikiLivros Linguagem C

    5/125

    iv CONTEDO

    16.4.4 break e continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4016.5 Saltos incondicionais: goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4016.6 Terminando o programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    17 Programar em C/Funes 4217.1 O que funo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4217.2 Denindo uma funo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    17.2.1 Valor de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4317.2.2 Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4317.2.3 Chamadas de funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

    17.3 Dois exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4317.4 Prottipo ou Declarao de funo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4417.5 Variveis locais versus globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    17.6 Passagem de parmetros por valor e por referncia . . . . . . . . . . . . . . . . . . . . . . . . . . 4517.7 void . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4517.8 Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4517.9 inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    18 Programar em C/Pr-processador 4718.1 O pr-processador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4718.2 Diretivas de compilao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    18.2.1 #include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    18.2.2 #dene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4718.2.3 #undef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4818.2.4 #ifdef e #ifndef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4818.2.5 #if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4818.2.6 #else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4818.2.7 #elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    18.3 Usos comuns das diretivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4818.4 Concatenao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    19 Programar em C/Exerccios 4919.1 Questes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4919.2 Escrevendo programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    19.2.1 Exerccio 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4919.2.2 Exerccio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4919.2.3 Exerccio 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4919.2.4 Exerccio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4919.2.5 Exerccio 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5019.2.6 Exerccio 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5019.2.7 Exerccio 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5019.2.8 Exerccio 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

  • 8/9/2019 WikiLivros Linguagem C

    6/125

    CONTEDO v

    19.2.9 Exerccio 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5019.2.10 Exerccio 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5019.2.11 Exerccio 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    20 Programar em C/Vetores 5220.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    20.1.1 Abreviando as declaraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5220.1.2 Exemplo de Aplicao de Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    20.2 Vetores multidimensionais (matrizes) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5220.3 Argumentos na funo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    20.3.1 Exemplo de uso de parmetros na funo main . . . . . . . . . . . . . . . . . . . . . . . 53

    21 Programar em C/Strings 5421.1 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5421.2 Funes da biblioteca padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    21.2.1 strlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5421.2.2 strcpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5421.2.3 strcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5421.2.4 strcmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5521.2.5 strrchr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5521.2.6 memcpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5521.2.7 memset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    21.2.8 sprintf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    22 Programar em C/Passagem de parmetros 5722.1 Passagem de Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    23 Programar em C/Tipos de dados denidos pelo usurio 5823.1 Tipos de dados denidos pelo usurio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5823.2 Estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    23.2.1 Denindo o tipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5823.2.2 Declarando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5823.2.3 Inicializador designado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5923.2.4 Acessando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5923.2.5 Vetores de estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5923.2.6 Atribuio e cpia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5923.2.7 Passando para funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    23.3 Unies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5923.4 Enumeraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    23.4.1 Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    23.5 Campo de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    24 Programar em C/Enumerao 61

  • 8/9/2019 WikiLivros Linguagem C

    7/125

    vi CONTEDO

    24.1 Enumerations (enum) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6124.2 Criando um novo tipo de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    25 Programar em C/Unio 6225.1 Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6225.2 Declarao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6225.3 Unions com estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6225.4 Anonymous unions estruturas com unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    26 Programar em C/Estruturas 6326.1 Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6326.2 Declarar uma estrutura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6326.3 Matrizes de estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6326.4 Declarar instncias (objetos) da estrutura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6326.5 Acessar as variveis membro das estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6426.6 Iniciar uma estrutura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6426.7 Ponteiros para estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6426.8 Passando estruturas como argumento de funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 6426.9 Estruturas aninhadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    27 Programar em C/Ponteiros 6627.1 Bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    27.1.1 O que um ponteiro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    27.1.2 Declarando e acessando ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6627.1.3 Ponteiro e NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6727.1.4 Mais operaes com ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    27.2 Intermedirio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6827.2.1 Ponteiro de estrutura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6827.2.2 Ponteiros como parmetros de funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6827.2.3 Ponteiros e vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6927.2.4 Indexao estranha de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6927.2.5 Comparando endereos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    27.3 Avanado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6927.3.1 Ponteiros para ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6927.3.2 Passando vetores como argumentos de funes . . . . . . . . . . . . . . . . . . . . . . . 7027.3.3 Ponteiros para funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    28 Programar em C/Mais sobre variveis 7228.1 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7228.2 sizeof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7228.3 Converso de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    28.3.1 Casting: converso manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7328.4 Atributos das variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

  • 8/9/2019 WikiLivros Linguagem C

    8/125

    CONTEDO vii

    28.4.1 const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7428.4.2 volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7428.4.3 extern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7428.4.4 static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    28.4.5 register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    29 Programar em C/Mais sobre funes 7629.1 Os argumentos argc e argv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7629.2 Lista de argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

    30 Programar em C/Bibliotecas 7830.1 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7830.2 O arquivo-cabealho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7830.3 Compilao da biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    30.3.1 No GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7930.3.2 No MS Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    30.4 Compilao do programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    31 Programar em C/Entrada e sada em arquivos 8031.1 Trabalhando com arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8031.2 Abrindo e fechando um arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    31.2.1 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8131.2.2 Arquivos pr-denidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    31.3 Escrevendo em arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8131.3.1 fwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8131.3.2 fputc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    31.4 Lendo de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8231.4.1 fgetc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8231.4.2 fgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8231.4.3 fscanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8231.4.4 fscanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8231.4.5 fread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    31.5 Movendo pelo arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8331.5.1 fseek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8331.5.2 rewind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8331.5.3 feof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    31.6 Outras funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8331.6.1 ferror e perror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    32 Programar em C/Gerenciamento de memria 8532.1 Alocao dinmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    32.1.1 malloc e free . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8532.1.2 calloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

  • 8/9/2019 WikiLivros Linguagem C

    9/125

    viii CONTEDO

    32.1.3 realloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8632.1.4 Alocao Dinmica de Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8632.1.5 Alocao Dinmica de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    33 Programar em C/Sockets 8833.1 Abstraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8833.2 Funes da biblioteca padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8833.3 Famlias de endereo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8833.4 Estruturas de endereo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

    34 Programar em C/Makeles 8934.1 Makele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    34.1.1 Sintaxe de criao do arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    35 Programar em C/Lista de palavras reservadas 93

    36 Programar em C/Seqncias de escape 94

    37 Programar em C/Lista de funes 95

    38 Programar em C/Lista de bibliotecas 9638.1 Ligaes externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    39 Programar em C/Dicas de programao em C 9739.1 Convenes tipogrcas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9739.2 A funo printf a melhor amiga de um programador . . . . . . . . . . . . . . . . . . . . . . . . 9739.3 Tecle 1 para rodar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    40 Programar em C/Listas encadeadas 9940.1 Primitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9940.2 Lista encadeada linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9940.3 Iniciar uma lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9940.4 Insero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    40.4.1 Insero no incio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9940.4.2 Insero no m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    40.5 Remoo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10040.5.1 Remoo no incio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10040.5.2 Remoo no m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    40.6 Exibio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10040.6.1 Do m para a raiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10040.6.2 Da raiz para o m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    41 Programar em C/Pilha 10141.1 Pilha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10141.2 Construo do prottipo de um elemento da lista. . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

  • 8/9/2019 WikiLivros Linguagem C

    10/125

  • 8/9/2019 WikiLivros Linguagem C

    11/125

    x CONTEDO

    50.2.3 Licena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

  • 8/9/2019 WikiLivros Linguagem C

    12/125

    Captulo 1

    Programar em C/Capa

    Programar em C

    ndice>> Ir para o ndice >>

    1

    https://pt.wikibooks.org/wiki/Programar_em_C
  • 8/9/2019 WikiLivros Linguagem C

    13/125

    Captulo 2

    Programar em C/Por que aprender alinguagem C

    Em uma era onde o software est cada vez mais presenteno nosso dia a dia importante ter algumas bases de pro-gramao, e para tanto importante ter um bom materialcom explicaes claras e exemplos; e o livro Programarem C se presta bem ao exerccio.Mas por que C e no Java ou Basic, ou ainda Perl? Lin-guagens como o Java ou Perl so linguagens a base debytecode interpretadoporumamquina virtual, sendo as-sim, no um cdigo interpretado diretamente pelo pro-cessador. Ao contrrio de muitas linguagens de progra-mao, o C permite ao programador enderear a mem-ria de maneira muito parecida como seria feito em As-sembly. Linguagens como o Java ou o Perl fornecem me-canismos que permitem que o programador faa o seutrabalho sem ter que se preocupar com a atribuio dememria ou com apontadores. Geralmente isso bom,uma vez que bastante trabalhoso lidar com a alocaodememria quando escrevemos aplicaes com algoritmosde alto nvel. No entanto, quando lidamos com tarefasde baixo-nvel como aquelas que um ncleo (kernel) temobrigao de desempenhar, como a de copiar um con-junto de bytespara umaplaca de rede, torna-se altamentenecessrio um acesso direto memria algo que no possvel fazer com Java. C pode ser diretamente com-pilado em cdigo de mquina, e por isso rpido e e-ciente. Alm disso, C permite personalizar como imple-mentar cada coisa ao bsico, como alocao de memria,permitindo adaptaes para melhorar desempenho.Valelembrar que ossoftwaresinterpretadoresdescriptoubytecode,como Javae Python, soescritos em linguagenscomo C e C++.Ser uma surpresa que C seja uma linguagem to popu-lar?Como num efeito domin, a prxima gerao de progra-mas segue a tendncia dos seus ancestrais. Sistemas ope-racionais desenvolvidos em C sempre tm bibliotecas desistema desenvolvidas em C. Essas bibliotecas so usadaspara criar bibliotecas de programa (como Xlib, OpenGL

    ou GTK), e seus desenvolvedores geralmente decidemusar a mesma linguagem das bibliotecas de sistema. De-senvolvedores de aplicao usam bibliotecas de programa

    para desenvolver processadores de texto, jogos, tocado-res de mdia, etc. Muitos vo decidir trabalhar com amesma linguagem que a biblioteca foi escrita, e assim oprocesso continua...C uma das linguagens de programao mais popularespara se escrever sistemas operacionais, como o MicrosoftWindows, o Mac OS X e o GNU/Linux. Sistemas opera-cionais comunicam-se diretamente com o hardware; noh nenhuma camada mais baixa para mediar seus pedi-dos. Originalmente, os sistemas operacionais eram es-critos na linguagem Assembly, o que resultava em umcdigo muito rpido e eciente. Entretanto, escrever umsistema operacional em Assembly um processo tedioso(lento), e produz um cdigo que funcionar somente emuma arquitetura de CPU, tal como o x86 ou ARM. Es-crever um sistema operacional em uma linguagem de altonvel, tal como C, possibilita que os programadores rea-daptem o sistema operacional a vrias arquiteturas semprecisar reescrever todo o cdigo. O ncleo (kernel) Li-nux um exemplo de sistema operacional escrito em C,com apenas algumas sees do cdigo escritas em As-sembly, para poder executar instrues que s existemem uma ou outra arquitetura e para algumas otimizaes.

    2

    https://pt.wikipedia.org/wiki/Linux%2520(kernel)https://pt.wikipedia.org/wiki/Linux%2520(kernel)https://pt.wikipedia.org/wiki/GNU/Linuxhttps://pt.wikipedia.org/wiki/Mac%2520OS%2520Xhttps://pt.wikipedia.org/wiki/Microsoft%2520Windowshttps://pt.wikipedia.org/wiki/Microsoft%2520Windowshttps://pt.wikipedia.org/wiki/Sistemas%2520Operacionaishttps://pt.wikibooks.org/wiki/Perlhttps://pt.wikibooks.org/wiki/Basichttps://pt.wikibooks.org/wiki/Java
  • 8/9/2019 WikiLivros Linguagem C

    14/125

    Captulo 3

    Programar em C/Histria da linguagem C

    3.1 Histria

    3.1.1 Desenvolvimentos iniciais

    Kenneth Thompson ( esquerda) e Dennis Ritchie ( direita), oscriadores da linguagem C

    O desenvolvimento inicial da linguagem C ocorreu noslaboratrios Bell da AT&T entre 1969 e 1973. SegundoRitchie, o perodo mais criativo ocorreu em 1972. Deu-se o nome C linguagem porque muitas das suas ca-ractersticas derivaram de uma linguagem de programa-o anterior chamada "B". H vrios relatos que se refe-rem origem do nome B": Ken Thompson d crdito linguagem de programao BCPL, mas ele tambm criouuma outra linguagem de programao chamada 'Bon, emhonra da sua mulher Bonnie.Por volta de 1973, a linguagem C tinha se tornado su-cientemente poderosa para que grande parte do ncleode UNIX, originalmente escrito na linguagem de pro-gramao PDP-11/20 Assembly, fosse reescrito em C,tornando-se um dos primeiros ncleos de sistema opera-cional implementado em uma linguagem sem ser o As-sembly. Como exemplos anteriores pode-se citar o sis-tema Multics (escrito em PL/I) e TRIPOS (escrito emBCPL).

    3.1.2 C de K&R

    Em 1978, Ritchiee Kernighan publicaram a primeiraedi-o do livro The C Programming Language. Esse livro,

    conhecido pelos programadores de C como K&R, ser-viu durante muitos anos como uma especicao infor-mal da linguagem. A verso da linguagem C que ele des-creve usualmente referida como C de K&R. (A se-gunda edio do livro cobre o posterior padro ANSI C,descrito abaixo.) K&R introduziram as seguintes carac-tersticas na linguagem:

    Tipos de dados struct

    Tipos de dados long int

    Tipos de dados unsigned int

    O operador =+ foi alterado para +=, e assim sucessi-vamente (a anlise lxica do compilador confundiao operador =+. Por exemplo, i =+ 10 e i = +10).

    C de K&R frequentemente considerado a parte mais b-sica da linguagem cujo suporte deve ser assegurado porum compilador C. Durante muitos anos, mesmo aps aintroduo do padroC ANSI, eleeraconsiderado o me-nor denominador comum em que programadores de Cse apoiavam quando uma portabilidade mxima era dese-jada, j que nem todos os compiladores eram atualizadospara suportar na ntegra o padro C ANSI, e o cdigo Cde K&R razoavelmente bem escrito tambm vlido emrelao ao C ANSI.Nos anos que se seguiram publicao do C K&R, al-gumas caractersticas no-ociais foram adicionadas linguagem, suportadas por compiladores da AT&T e deoutros vendedores. Estas incluam:

    Funes void e tipos de dados void *

    Funes que retornam tipos struct ou union

    Campos de nome struct num espao de nome sepa-rado para cada tipo struct

    Atribuio a tipos de dados struct

    Qualicadores const para criar um objeto s de lei-tura

    Uma biblioteca-padro que incorpora grande parteda funcionalidade implementada por vrios vende-dores

    3

    https://pt.wikipedia.org/wiki/ANSI%2520Chttps://pt.wikipedia.org/wiki/TRIPOShttps://pt.wikipedia.org/wiki/Multicshttps://pt.wikipedia.org/wiki/BCPLhttps://pt.wikipedia.org/wiki/linguagem%2520de%2520programa%C3%A7%C3%A3o%2520Bhttps://pt.wikipedia.org/wiki/AT&T
  • 8/9/2019 WikiLivros Linguagem C

    15/125

    4 CAPTULO 3. PROGRAMAR EM C/HISTRIA DA LINGUAGEM C

    Enumeraes

    O tipo de ponto-utuante de preciso simples

    3.1.3 Os Padres C ANSI e C ISO

    Durante os nais da dcada de 1970, a linguagem C co-meou a substituir a linguagem BASIC como a lingua-gem de programao de microcomputadores mais usada.Durante a dcada de 1980, foi adotada para uso no PCIBM, e a sua popularidade comeou a aumentar signi-cativamente. Ao mesmo tempo, Bjarne Stroustrup, jun-tamente com outros nos laboratrios Bell, comeou a tra-balhar num projeto onde se adicionavam construes delinguagens de programao orientada por objetos lin-guagem C. A linguagem que eles produziram, chamadaC++, nos dias de hoje a linguagem de programao deaplicaes mais comum no sistema operativo Windowsda companhia Microsoft; C permanece mais popular nomundo UNIX.Em 1983, o Instituto Norte-Americano de Padres(ANSI) formou um comit, X3j11, para estabelecer umaespecicao do padro da linguagem C. Aps um pro-cesso longo e rduo, o padro foi completo em 1989 eraticado como ANSI X3.159-1989 Programming Lan-guage C. Estaversoda linguagem frequentemente re-ferida como C ANSI. Em 1990, o padro C ANSI, apssofrer umas modicaes menores, foi adotado pela Or-ganizao Internacional de Padres (ISO) como ISO/IEC9899:1990. Um dos objetivos do processo de padroni-zao C ANSI foi o de produzir um sobreconjunto doC K&R, incorporando muitas das caractersticas no-ociais subsequentemente introduzidas. Entretanto, mui-tosprogramas tinhamsido escritos e quenocompilavamem certas plataformas, ou com um certo compilador, de-vido ao uso de bibliotecas de funes no-padro e aofato de alguns compiladores no aderirem ao C ANSI.

    3.1.4 C99

    Aps o processo ANSI de padronizao, as especica-es da linguagem C permaneceram relativamente est-ticas por algum tempo, enquanto que a linguagem C++continuou a evoluir. (Em 1995, a Normative Ammend-ment 1 criou uma verso nova da linguagem C mas estaverso raramente tida em conta.) Contudo, o padro foisubmetido a umareviso nosnais da dcadade 1990, le-vando publicao da norma ISO 9899:1999 em 1999.Este padro geralmente referido como C99. O pa-dro foi adotado como um padro ANSI em Maro de2000.As novas caractersticas do C99 incluem:

    Funes em linha

    Levantamento de restries sobre a localizao dadeclarao de variveis (como em C++)

    Adio de vrios tipos de dados novos, incluindo olong long int (para minimizar a dor da transio de32-bits para 64-bits), um tipo de dados boolean ex-plicito e um tipo complex que representa nmeroscomplexos

    Disposies de dados de comprimento varivel Suporte ocial para comentrios de uma linha inici-

    ados por //, emprestados da linguagem C++

    Vrias funes de biblioteca novas, tais como sn-printf()

    Vrios arquivos-cabealho novos, tais como stdint.h

    O interesse em suportar as caractersticas novas de C99parece depender muito das entidades. Apesar do GCC evrios outros compiladores suportarem grande parte dasnovas caractersticas do C99, os compiladores mantidospela Microsoft e pela Borland no, e estas duas compa-nhias no parecem estar muito interessadas adicionar taisfuncionalidades, ignorando por completo as normas in-ternacionais.

    3.1.5 Resumo em ingls

    Em 1947, trs cientistas do Laboratrio Telefonia Bell,William Shockley, Walter Brattain, e John Bardeen cria-ram o transistor. A computao moderna teve incio. Em1956 no MIT o primeiro computador completamente ba-seado em transistores foi concludo, the TX-0. Em 1958na Texas Instruments, Jack Kilby construiu o primeirocircuito integrado. Mas mesmo antes do primeiro cir-cuito integrado existir, a primeira linguagem de alto nvelj tinha sido escrita.Em 1954 Fortran, a Formula Translator, foi escrito. Co-meou como Fortran I em 1956. Fortran veio a ser Algol58, o Algorithmic Language, em 1958. Algol 58 tornou-se Algol 60 em 1960. Algol 60 gerou CPL, o Combi-ned Programming Language, em 1963. CPL passou aser BCPL, Basic CPL, em 1967. BCPL engendrou B em1969. E de B surgiu C em 1971.B foi a primeira lngua da linhagem C diretamente, tendosido criado no Bell Labs por Ken Thompson. B erauma linguagem interpretada, utilizada no incio, em ver-ses internas do sistema operacional UNIX. Thompsone Dennis Ritchie, tambm da Bell Labs, melhorou B,chamando-NB; novas prorrogaes para NB criaram C,uma linguagem compilada. A maioria dos UNIX foi re-escrito em NB e C, o que levou a um sistema operacionalmais porttil.B foi, naturalmente, o nome de BCPL e C foi o seu su-cessor lgico.A portabilidade do UNIX foi a razo principal para a po-pularidade inicial de ambos, UNIX e C; pois ao invs de

    https://pt.wikibooks.org/wiki/Programar_em_C++
  • 8/9/2019 WikiLivros Linguagem C

    16/125

    3.1. HISTRIA 5

    criar um novo sistema operacional para cada nova m-quina, system programmers could simply write the fewsystem dependent parts required for the machine, andwrite a C compiler for the new system; and since mostof the system utilities were written in C, it simply madesense to also write new utilities in the language.

  • 8/9/2019 WikiLivros Linguagem C

    17/125

    Captulo 4

    Programar em C/Pr-requisitos

    pr-requisitopara um bomaprendizadodequalquer lin-guagem de programao conceitos sobre lgica de pro-gramao.Alm disso, para programar em C, voc precisa de umeditor de textos e um compilador, discutidos a seguir.

    4.1 Editor

    Para editaro cdigo de um programa, apenasnecessrioum editor de textos, qualquer um, at mesmo o Bloco deNotas do Windows.No entanto, h diversos editores que apresentam recur-sos que facilitam a edio de programas, como: des-taque/colorao de sintaxe, complementao de cdigo,formatao (indentao) automtica, ajuda integrada, co-

    mandos integrados para compilar etc. Entre todos elespodemos destacar o Vim e o Emacs, ambos com versespara Windows, Linux e Mac OS.Em sistemas GNU/Linux, a maioria dos editores de textojpossui recursos para facilitar a ediode programas emC. Principalmente, devido ao fato da maioria destes e boaparte do sistema terem sido programadas utilizando C ouC++.Entretanto, o editor apenas edita o cdigo. Paratransforma-lo em linguagem de mquina e o executar,precisaremos de um compilador.

    4.2 Compilador

    O cdigo em linguagem C consiste em instrues que ocomputador dever seguir. O compilador realiza o tra-balho de traduzir essas instrues para linguagem de m-quina, de forma a poderem ser executadas pelo computa-dor.

    4.3 Ligador ou linker

    A ligao de arquivosconsistena construo de umaima-gem memria que contm partes de cdigo compilados

    separadamente. Em outras palavras ele une os arquivosobjetos e as bibliotecas (estticas, dinmicas) para for-mar uma nova biblioteca ou um executvel.

    4.4 Obtendo um compiladorExistem diversos compiladores disponveis:

    Para Windows ou DOS

    MinGW (antigo mingw32): uma espcie de gcc para Windows. o compilador includocomoDev-C++, da Bloodshed. O Dev-C++ um IDE (siglaem ingls para Ambiente Integrado de Desenvolvi-mento) que facilita a edio e compilao de pro-gramas. Tem traduo para Portugus do Brasil.

    Borland C++: a Borland disponibilizou um com-pilador gratuito que funciona em linha de comando,como alternativa ao IDE comercial.

    DJGPP: porte do gcc para DOS. Tambm funcionano Windows, mas se o objetivo for rodar no Win-dows, recomenda-se o uso do mingw, que pode usu-fruir de todos os recursos do Windows.

    Microsoft Visual C++: compilador comercial daMicrosoft, que tambm tem um IDE. O Framework.NET, gratuito, tambm inclui o compilador (em li-nha de comando) do Visual C++.

    Bloodshed DEV-C++: ambiente de desenvolvi-mento integrado livre que utiliza os compiladoresdo projeto GNU para compilar programas para osistema operacional Microsoft Windows.

    Para Linux/Unix-like

    gcc: um conjunto de compiladores ociais do pro-jeto GNU, de cdigo aberto. Costumam vir ins-

    talados na maioria das distribuies GNU/Linux eest disponvel para diversas plataformas, principal-mente para as baseadas em sistemas do tipo unix.

    6

    https://pt.wikibooks.org/wiki/Gcchttps://pt.wikipedia.org/wiki/MinGWhttps://pt.wikipedia.org/wiki/compiladorhttps://pt.wikipedia.org/wiki/C++https://pt.wikipedia.org/wiki/Linuxhttps://pt.wikipedia.org/wiki/GNUhttps://pt.wikibooks.org/wiki/Vimhttps://pt.wikipedia.org/wiki/indenta%C3%A7%C3%A3ohttps://pt.wikibooks.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_Programa%C3%A7%C3%A3ohttps://pt.wikibooks.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_Programa%C3%A7%C3%A3o
  • 8/9/2019 WikiLivros Linguagem C

    18/125

    4.5. LINKS EXTERNOS 7

    GNUlinker: o ligador doprojeto GNU o nome doprograma ld e faz parte do pacote GNU BinaryUtilities.

    4.5 Links externos

    CodeBlocks: pginapara downloaddo CodeBlocks,uma IDE para C ao estilo do Dev-C++, porm, maisnova.

    Dev-C++: pgina para download do Dev-C++.

    DJGPP: pgina ocial, com informaes e linkspara download.

    GCC: pgina ocial do compilador para diversasplataformas.

    http://gcc.gnu.org/http://www.delorie.com/djgpp/http://www.bloodshed.net/dev/devcpp.htmlhttp://www.codeblocks.org/
  • 8/9/2019 WikiLivros Linguagem C

    19/125

    Captulo 5

    Programar em C/Utilizando umcompilador

    5.1 Compiladores: viso geral

    Um compilador , geralmente, um programa de modotexto, que deve ser operado diretamente da linha de co-mando, sem nenhuma interface grca. Essa uma dasrazes pelas quais muitas pessoas preferem usar IDEs.No entanto, saber um pouco sobre como usar o compila-dor pela linha decomando podevir a ser til, por exemploquando voc no tiver um IDE disposio. No ne-nhum bicho-de-sete-cabeas, e a sintaxe da maioria doscompiladores semelhante.Para executar o compilador, voc precisa abrir um ter-minal (ou prompt de comando, como costuma ser cha-mado no Windows, ou ainda console). lgico que se

    voc estiver em um sistema sem ambiente grco (comoo DOS), voc no precisa fazer isso.O Windows s tem um terminal nativo, que o inter-pretador de comandos dele (cmd.exe ou command.com).Pacotes como o Cygwin e o MSys (do mesmo projeto queo MinGW) incluem terminaisalternativos que funcionambasicamente maneira do Linux.No Linux, alm dos terminais de modo texto, h vriosemuladores de terminal, entre os quais esto o XTerm, oKonsole (KDE) e o Terminal do Gnome. O uso de todoseles idntico.

    5.2 gcc

    Como gcc, compilador da GNUutilizadoprincipalmenteno sistema operacional linux ou de tipo unix, voc podeexecutar a compilao e a montagem separadamente oucom um nico comando. Se voc tem vrios arquivos-fonte, mais recomendvel executar as duas etapas sepa-radamente: se voc atualizar apenas um arquivo, s pre-cisar recompilar o que atualizou e depois remontar. Noentanto, se voc est desenvolvendo um projeto grande, recomendvel usar ferramentas de automao do pro-cesso de compilao, como o make.Resumo:

    gcc [OPES] nome_do_arquivoAqui so listadas algumas das opes do gcc:

    -c: Compila o cdigo fonte mas no faz as ligaes.A sada um arquivo objeto.

    -o: serve para dar um nome ao arquivo de sada.

    -O2: ativa otimizao no nvel 2

    -g: salva os smbolos de depurao (o que permiteusar um depurador)

    -Wall: ativa todos os avisos do compilador

    -pedantic: ativa os avisos necessrios para que ocdigo esteja estritamentede acordo comos padres

    Para compilar o arquivo programa.c, gerando o cdigo-objeto programa.o":gcc [OPES] -c programa.cPara gerar o executvel programa binario bin ou pro-grama.exe no Windows/DOS a partir do cdigo-objeto:gcc [OPES] -o programa[.bin] programa.oPara gerar o executvel diretamente a partir do arquivo-fonte:gcc [OPES] -o programa[.bin] programa.c

    5.3 Visual C++

    Em alguma verso no especicada do Visual C++, paracompilar o arquivo programa.c, gerando o cdigo-objeto programa.obj":cl /c programa.cPara gerar o executvel programa.exe a partir docdigo-objeto:link /out:programa.exe programa.obj

    8

    https://pt.wikipedia.org/wiki/Make
  • 8/9/2019 WikiLivros Linguagem C

    20/125

    5.3. VISUAL C++ 9

    Para gerar o executvel a partir do arquivo-fonte:cl programa.c

  • 8/9/2019 WikiLivros Linguagem C

    21/125

  • 8/9/2019 WikiLivros Linguagem C

    22/125

    Captulo 7

    Programar em C/Um programa em C

    7.1 Um programa em C

    comum que o primeiro programa escrito em uma lin-guagem de programao seja um programa que escreveHello world!" (Ol mundo!"). Apresentamos o cdigoe, a seguir, analisaremos cada uma de suas linhas. Nose preocupe se no entender ainda alguns aspectos, tudoser abordado detalhadamente mais adiante.Note que o nmero das linhas dado apenas para facilitara referncia; se for copiar o cdigo, lembre-se de tirar osnmeros de linha.1. /* o meu primeiro programa */ 2. #include 3. int main() 4. { 5. printf (Ol, mundo!"); 6. return(0); 7. }

    O texto do programa tambm conhecido como cdigodo programa ou simplesmente cdigo fonte. O cdigofonte o programa escrito na linguagem de programa-o. Em nosso caso acima, chamamos cdigo C ou sim-plesmente cdigo.Voc deve copiar o cdigo acima em um editor detexto como notepad e salv-lo como ola.c (sem acento).Lembre-se de remover os nmeros das linhas. Caso con-trrio o cdigo no ir compilar. Esse arquivo agora re-presenta o cdigo fonte do programa escrito em C.Salvando o cdigo acima em um arquivo com a extenso".c e seguindo as instrues de compilao do do cap-

    tulo de utilizao de compilador, voc dever ver comoresultado um Ol, mundo!" na tela. A seguir vamos aanlise do cdigo.A primeira linha um comentrio, que para o compila-dor no tem nenhum signicado. Qualquer texto que es-teja entre as marcaes /* e */, podendo inclusive ocuparvrias linhas, ser considerado como comentrio e sercompletamente ignorado pelo compilador. muito tilcomo documentao, explicando o que as prximas li-nhas de cdigo fazem.A linha 2 pede que seja inserido o contedo do arquivostdio.h (que est num lugar j conhecido pelo compila-

    dor). Esse arquivo contm referncias a diversas funesde entrada e sada de dados (stdio abreviao de Stan-dard Input/Output , ou Entrada e Sada Padronizadas), de

    modo que voc precisar dele em praticamente todos osprogramas ele o meio de quase toda comunicaocom o teclado, com a tela e com arquivos.[1]

    Os programas em C so organizados em funes todocdigo em C deve fazer parte de umafuno. Em particu-lar, todo programa deve ter uma funo chamada main,pela qual ser iniciada a execuo do programa. A fun-o denida, no nosso exemplo, na linha 3, e delimitadapelas chaves { }.A palavra-chave int signica que a funo devolve umvalor inteiro (voc pode pensar nesse valor exatamentecomo o valor de uma funo em matemtica).Na linha 5, executamos a funo printf , que imprimena tela os parmetros que lhe foram passados nonosso exemplo, passamos a seqncia de caracteres Ol,mundo!" como parmetro. Essa uma das funes de-

    nidas em um cabealho da biblioteca C, o arquivostdio.h.Note o ponto-e-vrgula no nal da linha: todas as ins-trues em C devem terminar com um ponto-e-vrgula.(Essa umacausamuitocomum de erros de compilao).Na linha 6, dizemos que a funo main deve devolver (ouretornar) o valor 0 e terminar sua execuo. (Esse ovalor inteiro que dissemos que amos retornar na linha3.)O padro da linguagem C diz que a funo main deve de-volver um valor inteiro, e esse valor diz se o programa foiexecutado com sucesso ou no. O valor zero indica que o

    programa foi nalizado sem nenhum erro, e valores dife-rentes de zero podem indicar diferentes erros. Voc noprecisar se preocupar com isso no incio do seu estudoem C o valor devolvido por um programa geralmenteusado em scripts, quando (por exemplo) um comando spode ser executado se o anterior tiver ocorrido com su-cesso.

    7.2 Compilando o programa

    7.2.1 Linux

    A maioria das distribuies linux j possuem compila-dor C na instalao padro. Para compilar o programa

    11

    https://pt.wikibooks.org/wiki/Programar_em_C/Utilizando_um_compilador
  • 8/9/2019 WikiLivros Linguagem C

    23/125

    12 CAPTULO 7. PROGRAMAR EM C/UM PROGRAMA EM C

    acima(ola.c) abra um terminal, entre na pasta onde o ar-quivo se localiza e digite o seguinte comando:gcc -o ola ola.cO compilador ir gerar o arquivo executvel chamado olaque pode ser executado da seguinte forma:

    ./ola

    [1] Esse comando uma diretiva do pr-processador ; vocaprender mais sobre esses comandos na seo Pr-processador.

    https://pt.wikibooks.org/wiki/Programar_em_C/Pr%C3%A9-processadorhttps://pt.wikibooks.org/wiki/Programar_em_C/Pr%C3%A9-processador
  • 8/9/2019 WikiLivros Linguagem C

    24/125

    Captulo 8

    Programar em C/Conceitos bsicos

    Vocj viuum programa bsico em C. Antes de comeara se dedicar ao estudo de C, bom que voc compreendaalguns termos e alguns aspectos da linguagem, o que fa-cilitar sua compreenso dos captulos seguintes. A se-guir, formalizaremos alguns aspectos da estrutura bsicada linguagem.

    8.1 Estrutura bsica Um programa em C basicamente estruturado em

    blocos de cdigo. Blocos nada mais so que con-juntos de instrues, e devem ser delimitados comchaves ({ ... }). Um bloco tambm pode conter ou-tros blocos.

    Uma instruo geralmente corresponde a uma ao

    executada, e deve sempre terminar com ponto-e-vrgula (;).

    O compilador ignora espaos, tabulaes e quebrasde linhano meiodo cdigo; esses caracteres socha-mados genericamente de espao em branco (whi-tespace). Ou seja, os trs trechos a seguir so equi-valentes:

    printf(Ol mundo);return 0;printf (Ol mundo); return 0;printf( Ol mundo ); return 0 ;

    No entanto, voc achar muito mais fcil de ler um es-tilo de cdigo mais parecido com o segundo exemplo.Costuma-se usar (mas no abusar de) espaos e tabula-es para organizar o cdigo.

    A linguagem sensvel utilizao de maisculas eminsculas. Por exemplo, se voc escrevesse Printfno lugar de printf, ocorreria um erro, pois o nomeda funo totalmente em minsculas.

    8.1.1 Escopo

    Geralmente, em programao, no queremos que outrasfunes usem as variveis que estamos manipulando no

    momento. O conceito de escopo est justamente relaci-onado a isso. Escopo o nvel em que um dado podeser acessado; em C h dois nveis: local e global. Umavarivel global pode ser acessada por qualquer parte doprograma; variveis locais podem ser acessadas apenasdentro do bloco onde foram declaradas (ou nos seus sub-blocos), mas no fora dele (ou nos blocos que o contm).Isso possibilita que voc declare vrias variveis com omesmo nome mas em blocos diferentes. Veja um exem-plo:int a; { int a; int b; } { int b; }

    As duas variveis chamadas b so diferentes e s podemser acessadas dentro do prprio bloco. A primeira vari-vel a global, mas spodeser acessadanosegundobloco,pois a varivel local a no primeiro bloco oculta a varivelglobal de mesmo nome. Note que isso possvel em C, etome cuidado para no cometer erros por causa disso.

    8.2 Introduo s funes

    Funes so muito usadas, no s em C, mas em lin-guagens de programao em geral. Uma funo basi-camente um bloco de cdigo que realiza uma certa ta-refa. Quando queremos realizar aquela tarefa, simples-mente fazemos uma chamada de funo para a funo

    correspondente.Uma funo pode precisar que o programador d certosdados para realizar a tarefa; esses dados so chamadosargumentos. A funo tambm pode retornar um valor,que pode indicar se a tarefa foi realizadacomsucesso, porexemplo; esse valor o valor de retorno. Podemos fazeruma analogia com as funes matemticas: as variveisindependentes so os argumentos e o valor numrico dafuno o valor de retorno.Em C, para chamar uma funo, devemos escrever o seunome, seguido da lista de argumentos (separados por vr-gula) entre parnteses, mesmoquenohajanenhumargu-

    mento. Lembre que a chamada de funo tambm umainstruo, portanto devemos escrever o ponto-e-vrgulano nal. Alguns exemplos de chamadas de funes:

    13

    https://pt.wikibooks.org/wiki/Programar_em_C/Um_programa_em_C
  • 8/9/2019 WikiLivros Linguagem C

    25/125

    14 CAPTULO 8. PROGRAMAR EM C/CONCEITOS BSICOS

    funcao(arg1, arg2, arg3); funcao();

    Se quisermos saber o valor de retorno de uma funo,podemos armazen-lo numa varivel. Variveis sero in-troduzidas logo adiante, mas a sintaxe muito fcil de

    aprender:valor_de_retorno = funcao(arg1, arg2);

    Vejamos um exemplo completo://quadrado.c //calcula o quadrado de um nmero#include int square( int num1 ) { returnnum1 * num1; } int main(){ int number; int result;printf("\nDigite um numero: "); scanf("%d, &number);result = square(number); printf(O Quadrado de %d eh:%d, number, result); return 0; }

    Em C, todo o cdigo (exceto as declaraes de variveise funes) deve estar dentro de funes. Todo programadeve ter pelo menos uma funo, a funo main, que por onde comea a execuo do programa.

    8.3 Expresses

    Um conceito muito importante em programao o deexpresso. Expresses so conjuntos de valores, vari-veis, operadores e chamadas de funes que so avalia-dos ou interpretados para resultar num certo valor, que

    chamado o valor da expresso. Por exemplo:

    3 * 4 + 9 uma expresso de valor 21;

    a + 3 * b uma expresso equivalente expressomatemtica a + 3b;

    foo() uma expresso cujo valor o valor de retornoda funo foo.

    8.4 Comentrios

    Muitas vezes bastante til colocar comentrios no c-digo, por exemplo para esclarecer o que uma funo faz,ou qual a utilidade de um argumento, etc. A maioria daslinguagens de programao permite comentrios; em C,eles podem aparecer de duas maneiras:/* Comentrios que podem ocupar vrias linhas. */

    e// Comentrios de uma linha s, que englobam // tudodesde as duas barras at o nal da linha.

    Tudo que estiver entre as marcas /* e */ ou entre // serignorado pelo compilador. Note que os comentrios de

    uma linha s (iniciados por //) foram incorporados ao pa-dro da linguagem apenas em 1999, e portanto algunscompiladores podem no os suportar. As verses maisrecentes do GCC no tero problema em suportar essetipo de comentrio.

  • 8/9/2019 WikiLivros Linguagem C

    26/125

    Captulo 9

    Programar em C/Variveis

    9.1 Variveis

    Em um programa, existe a necessidade de se guardar va-lores na memria, e isso feito atravs de variveis, quepodem ser denidas simplicadamente como nomes quese referem a lugares na memria onde so guardados va-lores. Ao declararmos uma varivel, no apenas estamosreservando um espao de memria, como tambm esta-mos associandoumnomea ele, oidenticador. Aoinvsde utilizarmos o endereo da varivel namemria, quese-ria geralmente notado na forma hexadecimal, como porexemplo 0x0012FED4, referimo-nos ao endereo apenaspelo seu nome. Apenas para deixar claro, a prpria no-tao em hexadecimal j uma simplicao, pois com-putadores na verdade trabalham com binrio.Em C, para utilizar uma varivel, ela deve ser primeira-mente declarada, ou seja, devemos requisitar o espaonecessrio para essa varivel. Aps reservar um espaona memria, o computador ir associar a ele o nomeda varivel. Se voc no declarar uma varivel e tentarutiliz-la, o compilador ir avis-lo disso e no continu-ar a compilao.

    9.2 Declarando variveisGenericamente, para declarar uma varivel, usamos a se-guinte instruo:tipo_da_varivel nome_da_varivel;Por exemplo, para declarar uma varivel do tipo int como nome a, podemos escreverint a;

    sempre necessrio indicar o tipo da varivel, pois cada

    tipo tem um tamanho diferente, ou seja, ocupa mais oumenos espao na memria do computador. Mais adianteintroduziremos os tipos de varivel.

    9.3 Atribuindo valores

    Se quisermos associar um valor a uma varivel, usamos ooperador = (igual):

    a = 5;

    Nesse caso, estamos pedindo que o computador guarde ovalor 5 no espao alocado varivel a.Observao: Apesar de este operador se assemelhar aoigual da matemtica, sua funo diferente. Para veri-car a igualdade de dois valores, usamos o operador decomparao "==" (dois iguais). possvel tambm atribuir um valor a uma varivel aomesmo tempo que ela declarada, o que chamado deinicializar a varivel. Por exemplo:

    int a = 5;

    possvel tambm declarar mais de uma varivel de ummesmo tipo em umanica instruo, separando os nomespor vrgulas. Tambm possvel inicializar as variveisdessa maneira:int a, b, c, d; int e = 5, f = 6; int g, h = 2, i = 7, j;

    Como o prprio nome j diz, o valor existente numa va-rivel pode ser mudado, da mesma maneira que ele nor-malmente atribudo. Se tivermos:

    int a; a = 2; a = 3;no nal o valor da varivel a ser 3.

    9.4 Exemplo de erro

    a = 25;Mesmo sabendo que um exemplo de erro, escreva o c-digo acima em um arquivo .c e tente compilar para sefamiliarizar com as mensagens de erro do compilador,assim voc saber o que fazer quando elas ocorrerem.No exemplo acima no foi declarada a varivel a, ao ten-tar compilar o compilador informa que o smbolo a no

    15

  • 8/9/2019 WikiLivros Linguagem C

    27/125

  • 8/9/2019 WikiLivros Linguagem C

    28/125

    Captulo 10

    Programar em C/Tipos de dados

    'At agora voc s viu as variveis do tipo int, que servempara guardar nmeros inteiros. A linguagemC temoutrostipos fundamentais. So eles:

    int, para nmeros inteiros entre 2147483648 e2147483647, utiliza 4 bytes;

    char, para caracteres individuais do padro ASCII,utiliza 1 byte;

    oat, para reais entre (aproximadamente) 10 38 e1038 , utiliza 4 bytes, preciso de 7 dgitos;

    double, para reais entre (aproximadamente) 10 4932e 104932 , utiliza 8 bytes, preciso de 15 dgitos;

    bool, para indicar true (verdadeiro) ou false (falso),

    utiliza 1 byte; Presente apenas no padro C99 emdiante.

    10.0.1 Explicando bits e bytes

    Podemos pensar na memria do computador como umata, uma grande ta feita de frames sequenciais.Em cada um desses frames, podemos colocar uma certavoltagem: tem voltagem ou no tem voltagem: se temvoltagem associamos o valor 1, se no tem voltagem as-sociamos o valor 0. Da termos a linguagem binria de

    zeros e uns.Agora podemos fazer combinaes se tivermos posiode zeros e uns, da direita para a esquerda.

    00000000 1 Combinao

    00000001 2 Combinao

    00000010 3 Combinao

    00000011 4 Combinao

    00000100 5 Combinao

    00000101 6 Combinao 00000110 7 Combinao

    00000111 8 Combinao

    E na verdade podemos estender este conceito para um

    nmero innito de combinaes.Ora o que aconteceu que nos bastavam pouco menosde 256 combinaes (8 bits ordenados) para termos umacombinao para cada letra, maiscula e minscula, n-mero, pontos de exclamao, interrogao, etc. e issoera o suciente para a nossa comunicao. Mas para ha-ver um certo consenso para que uma dada combinaodesse um dado smbolo surgiu a tabela ASCII (surgiramoutras tabelas quando se quis colocar os smbolos de ou-tras lnguas, como o japons ouo chins ver tabela ISO)Portanto com 8 bits ou 8 casas conseguamos ter qualquersmbolo que utilizamos. A esse conjunto de 8 bits cha-

    mamos de byte, mais convenientemente. Portanto, umbyte tem 8 casas de zeros /uns , ou seja 2 elevado a 8 das 256 combinaes. E o byte a unidade bsica que oC++ consegue operar e representado pelo tipo char.Pergunta: Quando tivermos mais do que 256 bytesacrescenta-se um outro byte?

    Sim. Com dois bytes o nmero de combinaes 256*256.

    Pergunta: Qual a razo do computador usar apenas by-tes como medida mnima? Ser que no seria possvel

    utilizar 7 bits ou 5 bits? No possvel pelo fato do computador s entender

    0 e 1 ento no caso impossvel se ter um nmerompar de bits porque tudo tem que ter o 0 e o 1 porisso que tudo na informtica evolui multiplicando-sepor 2 (32, 64, 256, 512)

    10.0.2 Nmeros inteiros

    Se dissermos que 2 bytes representam inteiros, pode-remos utilizar as 65 536 combinaes, pois 2 bytes 16bits- temos 2 elevado a 16 = 65 536 e isso dar-nos-ia esses nmeros todos. Assim se quisermos apenas ospositivos com o zero temos de [0, 65535].

    17

  • 8/9/2019 WikiLivros Linguagem C

    29/125

    18 CAPTULO 10. PROGRAMAR EM C/TIPOS DE DADOS

    Se quisermos ter nmeros negativos e positivos podemosdividir esse valor a meio e d 32768 para cada lado po-sitivo e negativo, mas como temos de ter o zero vamosroubar um valor ao lado positivo e ento camos com ointervalo [ 32768, 32767]. E camos com as mesmas65 536 combinaes.Apresentamos inteiro com 2 bytes, mas eles podem ter4 bytes, isso vai depender do processador do computa-dor, ie, com quantos bytes consegue ele lidar ao mesmotempo.Tambm existem outros tipos, como short (ou short int),que serve para inteiros menores, long (ou long int) parainteiros maiores. Qualquer tipo inteiro pode ser prece-dido por unsigned (o signed para COM negativos), paracortar os nmeros negativos, permitindo maior capaci-dade de armazenamento de nmeros positivos. Algunscompiladores aceitam o long long, para aumentar aindamais o tamanho da varivel, algunsdessess aceitam parao tipo int, outros tambm para o tipo double.Podemos alterar a maneira como os dados so guardadoscom os modicadores de tipo. Voc pode modicar ostipos de duas maneiras.

    Tamanho: short e long

    Voc pode modicar o tamanho de uma varivel usandoos modicadores de tipo, que so dois: short e long.Note que oat e char no podem ser modicados em ta-

    manho.

    short diminui o espao necessrio para guardar avarivel (diminuindo tambm a gama de valores queesta pode assumir). S pode ser usado com int.

    long aumenta o espao tomado pela varivel, e por-tanto aumenta seu valor mximo e/ou sua preciso.Pode ser usado com int e double.

    O padro C de 1999 adicionou um terceiro modi-cador, suportado pelos compiladores mais recen-

    tes, inclusive o gcc: long long, que aumentaria aindamais a capacidade da varivel. Alguns deles supor-tam esse modicador apenas para o tipo int, e outrossuportam tambm para double.

    Uma observao necessria: segundo o padro, noexiste nenhuma garantia de que uma varivel short int menor que uma varivel int, nem que long int maior queint. Apenas garantido que int no maior que long nemmenor que short. De fato, nos sistemas x86 de 32 bits (ouseja, a maioria dos computadores pessoais atualmente), otamanho de int igual ao de long. Geralmente, int ser

    o tamanho nativo do processador ou seja, 32 bits numprocessador de 32 bits, 16 bits num processador de 16bits etc.

    Sinal: signed e unsigned

    Existe outro tipo de modicador, que dene se o nmerovai ser guardado com sinal ou no. So os modicadoressigned e unsigned, suportados pelos tipos inteiros apenas.

    signed diz que o nmero deve ser guardado com si-nal, ou seja, sero permitidos valores positivos e ne-gativos. Esse o padro, portanto esse modicadorno muito usado.

    unsigned diz que o nmero deve ser guardado semsinal. Com isso, o valor mximo da varivel au-menta, j que no teremos mais valores negativos.Por exemplo, com uma varivel char podemos guar-dar valores de 128 a 127, mas com uma varivelunsigned char pode guardar valores de 0 a 255.

    Para usar esses modicadores, devemos coloc-los antesdo nome do tipo da varivel, sendo que o modicadorde sinal deve vir antes do modicador de tamanho casoambos sejam usados. Por exemplo:unsigned char c; short int valor; unsigned long intresultado;Nota: Voc pode abreviar short int e long int parasimplesmente short e long, respectivamente.

    Tabela de tipos inteiros

    Convm ver a tabela de tipos inteiros.Tipo Num de bits Formato para leitura com scanf Inter-valo Inicio Fim char 8 %c 128 127 unsigned char 8 %c0 255 signed char 8 %c 128 127 int 16 %i 32.76832.767 unsigned int 16 %u 0 65.535 signed int 16 %i 32.768 32.767 short int 16 %hi 32.768 32.767 un-signed short int 16 %hu 0 65.535 signed short int 16%hi 32.768 32.767 long int 32 %li 2.147.483.6482.147.483.647 signed long int 32 %li 2.147.483.6482.147.483.647 unsigned long int32 %lu 0 4.294.967.295Nota: O tipo long 32 bits como int em computadoresde arquitetura 32 bits e 64 bits em computadores de ar-quitetura 64 bits no padro LP64 (Mac OS X e Unix).

    10.0.3 Nmeros de ponto utuante

    Os nmeros de ponto utuante so uma tentativa paraguardar nmeros reais, como 3,1415 (pi), 2,3333,0,00015, 6,02 1023 . Ao contrrio dos nmeros reais,os nmeros representveis pelo hardware so nitos. Amaneira como os tipos de ponto utuante so armazena-dos abstrata para o programador, entretanto, o hardwaresegue o padro IEEE 754 (Standard for Floating-PointArithmetic).O armazenamento feito usando notao cientca bin-ria.

  • 8/9/2019 WikiLivros Linguagem C

    30/125

    19

    Os tipos oat e double servem para guardar nmeros deponto utuante. A diferena entre os dois , alm do in-tervalo de dados, a preciso. Geralmente, o tipo oatguarda dados (com sinal positivo ou negativo) de 3,4E-38 a 3,4E+38 (alm do zero). J double suporta nmerosto pequenos quanto 1,7E-308 e no mximo 1,7E+308.oat 32 %f 3,4E-38 3.4E+38 double 64 %lf 1,7E-308 1,7E+308 long double 80/128 %Lf 3,4E-49323,4E+4932Nota: O tipo long double trabalha em mquinas x64 nopadro LP64 (Mac OS X e Unix)

    10.0.4 Bool

    Este tipo surgiu porque muitas vezes apenas se quer ter2 valores: sim/no ; verdadeiro/falso. Tem o tamanho deum byte e tem apenas dois valores 0 e 1 que correspondea true e false.Por que guardar um bool num byte quando se pode utili-zar apenas um bit? A razo que o computador usa nomnimo o byte, no o bit.

    10.0.5 Endereos

    Os vrios locais na memria so identicados por um ad-dress, que tem uma lgica sequencial numerada. So ne-cessrios 16 bits para guardar o endereo de um byte.dito de outra forma so necessrios 2 bytes para guardara morada de um byte. ser isto verdade?!! isso quer di-zer que se guardarmos os endereos de todos os bytes, stemos 1/3 da memria disponvel para guardar valores.Bem isto um pouco estranho, mas repare-se que ape-nas vamos guardar os addresses das variveis reservadas.Depois as variveis nem sempre so de 1 byte, por issoapenas iremos guardar o endereo do primeiro byte e node todos. por m faz sentido guardar o endereo de ou-tro endereo? Os endereos de memria (addresses) sonormalmente expressos em linguagem hexadecimal (base16, utilizam os 10 algarismos mais as 6 primeiras letras de a a f - do alfabeto para fazerem as 16).

    10.0.6 Compatibilidade de dados na atri-buio de valor

    Se tentarmos colocar um valor diferente do tipo esperadoda varivel? Temos um problema de compatibilidade dedados:

    Caso 1: Declaramos um int e colocamos uma letra

    Aqui no teremos problemas. Os literais

    de caracteres so, nativamente, do tipoint . O resultado ser um inteiro que con-tm o valor ASCII do caractere dado.

    Caso 2: Declaramos um int e colocamos uma string(sequncia de caracteres)

    Aqui teremos um erro de compilao,em que nos diz que no conseguimosconverter const char [5]" em int. Per-

    ceba com isso que o compilador tem al-guns sistemas de converso note ocaso 3.

    Caso 3: Declaramos um int e colocamos um oat

    Neste caso, se colocarmos 77.33, ir serapenas guardado o valor 77, perdendo-sea parte decimal.

    Caso 4: overow declaramos um short e coloca-mos um valor maior que o mximo

    Lembre-se que o tipo short guarda va-lores de 32767 a 32767. Se colocar-mos 32768 (e o compilador no esten-der esses limites), no vai acontecer ne-nhum erro de compilao; o que resulta que vai ser impresso um nmero ne-gativo, 32767 (ou, como comum emvrios compiladores, 32768). A lgicadisto tem a ver com a maneira como ocomputador guarda nmeros negativos.Mas tambm podemos fazer uma analo-gia com as horas. Imaginemos que va-mos somar 6 horas com 7 horas. O re-sultado seria 13, mas como no existe 13no relgio, iramos dar a volta nas horase chegar ao 1. Assim o resultado ser 1.

    Caso 5: underow declaramos um short e colo-camos um valor inferior ao mnimo possvel.

    Aqui temos exatamente a mesma lgicado caso de overow, mas desta vez ex-cedido o limite inferior e no o superior.

    Caso 6: declaramos um unsigned int e colocamosum nmero negativo

    O que acontece aqui semelhante a umunderow. Mas o que ocorre que o n-mero guardado como seria se fosse umint comum, negativo. O que muda naprtica a interpretao desse nmero,de acordo com o tipo de dado que lheest atribudo. Se tentarmos l-lo comoum unsignedint, obteremosum valorpo-sitivo obtido pela mesma lgica do over-

    ow/underow; se o lermos como um(signed) int, obteremos o mesmo valornegativo que lhe atribumos.

  • 8/9/2019 WikiLivros Linguagem C

    31/125

    20 CAPTULO 10. PROGRAMAR EM C/TIPOS DE DADOS

    10.0.7 Converter um tipo de varivel

    A converso de uma varivel consiste em converter o tipode uma varivel em um outro. Imagine que voc estejatrabalhando com uma varivel do tipo oat e por algumarazo queira eliminar os nmeros que esto depoisda vr-gula.Esta operao pode ser realizada de duas maneiras.Converses do tipo implcita: Consiste em uma modi-cao do tipo de varivel que feita automaticamentepelo compilador.

    Ex:

    int x; x = 7.123;Converses do tipo explcita: Tambm chamada deoperao cast, consiste em forar a modicao do tipode varivel usando o operador cast "( )".

    Ex:

    int y; y = (int)7.123;Veja um exemplo da converso de tipo inteiro em carac-teres. Aqui convertemos um numero decimal em um ca-ractere ASCII.#include int main() { int y = 65; char x; x =(char) y; printf(O numero inteiro: %d \n O caractere:%c \n\n, y, x); }

    10.0.8 Literais

    Em programao, um literal uma notao que repre-senta um valor constante. Exemplos de literais em C so415, 19.52, 'C', Joo. Esses exemplos representam osquatro tipos de literais em C: literais de inteiros, literaisde reais, literais de caracteres e literais de strings. Scom esses exemplos j possvel deduzir como se usamos literais; mas importante fazer algumas observaes:

    Literais de inteiros podem ser especicados nas ba-ses decimal, octal ou hexadecimal. Se o literal forprexado com 0x ou 0X, ele ser interpretadocomo hexadecimal; se o prexo for apenas 0, serinterpretado como octal; ou se no houver prexo,ser interpretado como decimal.

    Literais de reais podem ser especicados naforma decimal (144.57) ou em notao cientca(1.4457e+2). Lembre-se que o separador decimal o ponto e no a vrgula, como seria usual.

    Literais de caracteres devem vir entre aspas simples(') e contera representao de apenasum caractere1 .

    Usos vlidos seriam: 'c', '\n', '\x1b', '\033'. Se vocquiser usar a aspa simples como caractere, preceda-a com uma barra invertida: '\''.

    Literais de strings devem vir entre aspas duplas (").Para usar aspas duplas dentro de strings, preceda-ascom barra invertida: Ele disse \"Ol\".. Note queum literal de string adiciona o caractere nulo (\0)ao nal da string, pois ele , em C, a maneira dedelimitar o nal de uma string.

    Na verdade, segundo o padro C, literais de caracterespodem conter a representao de mais um caractere, maso uso deles seria para representar nmeros e no sequn-cias de caracteres; um aspecto pouco utilizado da lin-guagem C.

  • 8/9/2019 WikiLivros Linguagem C

    32/125

    Captulo 11

    Programar em C/Constantes

    11.1 Constantes

    Em um captulo anterior abordamos as variveis e agoravamos abordar constantes. A razo que as coisas estomais maduras e uma pessoa sabe muito bem o que umaconstante. Que simplesmente um valor que no se al-tera durante a execuo do programa. A questo de nose alterar durante a escrita do programa realmente a ra-zo deste captulo. Devemos separar as guas entre umaconstante e um literal. O literal o prprio valor.Existem 3 maneiras para criar constantes:

    1. #dene

    2. [const] [tipo da varivel][nome da varivel]

    3. enumerations

    Esta ltima vamos deixar para mais tarde, pois so umaboa introduo para as classes.

    11.2 DEFINED CONSTANTS(#DEFINE)

    #dene PI 3.14159265 #dene NEWLINE "\n

    Se colocarmos estas linhas no header, o que vai acontecer o seguinte: O pr-processador ir vericar o nosso c-digo fonte e sempre que encontrar a diretiva #dene ir,literalmente, substituir cada ocorrncia do identicadorno cdigo fonte pelo valor denido.A vantagem disto que:

    Podemosterum identicador ao nosso gosto, e sem-pre que necessitarmos do valor escrevemos o iden-ticador, em vez do valor, at porque se o valorfosse complicado poderamos enganar-nos a escre-

    ver. Claro que nos poderamos enganar tambm aescrever o identicador, daa escolhermos um nomefamiliar.

    E se necessitarmos de alterar o valor, alteramosape-nas 1 vez, em vez de todas as vezes onde apareceriao valor.

    O formato geral :#dene identicador valorRepare que a diretiva de preprocessador no tem o ;-ponto e vrgula no m! O que normal para diretivasde Preprocessador.O que que acontece se tivermos o ; no m? Serque encontrei um bug? se eu colocar o ; no #dene NE-WLINE '\n'; no acontece nada.Vale lembrar que cada #dene preprocessador, ou seja,no pode ser alterado dentro do programa durante suaexecuo.

    // dened constants: calculate circumference #include #dene PI 3.14159 #dene NEWLINE "\nint main (){ double r=5.0; // radius double circle; circle= 2 * PI * r; // utilizamos o Pi e no 3. printf("%f,circle); printf("%s, NEWLINE ); return 0; }

    11.3 Declared constants (const)

    Ns podemos transformar uma varivel numa constantedo gnero:

    const int tamanho = 100;

    const char tabul = '\t';

    const int codigo = 12440;

    Como prexoconst, dizemos que a varivel nopoderalterar o seu valor.Repare que se fosse uma varivel eu poderia ter:int a=5;

    e