Você está na página 1de 9

C uma linguagem de programao compilada de propsito geral, estruturada, imperativa, procedural, padronizada pela ISO, criada em 1972, por

r Dennis Ritchie, no AT&T Be ll Labs, para desenvolver o sistema operacional Unix (que foi originalmente escr ito em Assembly).1 C uma das linguagens de programao mais populares2 3 e existem poucas arquiteturas para as quais no existem compiladores para C. C tem influenciado muitas outras li nguagens de programao,4 mais notavelmente C++, que originalmente comeou como uma ex tenso para C. ndice 1 Histria 1.1 K&R C 1.2 ANSI C e ISO C 1.3 C99 1.4 C11 2 Viso geral 2.1 Tipos de dados 3 Relaes com C++ 4 Exemplos 4.1 Programa Ol Mundo 4.2 Matemtica 4.3 Estruturas de dados 5 Baixo-nvel 6 Ferramentas de programao 7 Ver tambm 8 Referncias 9 Ligaes externas Histria Ken Thompson e Dennis Ritchie (da esquerda para direita), os criadores das lingu agens B e C, respectivamente. O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973. No se sabe se o nome "C" foi dado linguagem porque muitas de suas caractersticas deriv aram da linguagem B e C a letra conseguinte no alfabeto, ou porque "C" a segunda letra do nome da linguagem BCPL, da qual derivou-se a linguagem B. C foi originalmente desenvolvido para a implementao do sistema Unix (originalmente escrito em PDP-7 Assembly, por Dennis Ritchie e Ken Thompson). Em 1973, com a a dio do tipo struct, C tornou-se poderoso o bastante para a maioria das partes do nc leo do Unix, serem reescritas em C. Este foi um dos primeiros sistemas que foram implementados em uma linguagem que no o Assembly, sendo exemplos anteriores os s istemas: Multics (escrito em PL/I) e TRIPOS (escrito em BCPL). Segundo Ritchie, o perodo mais criativo ocorreu em 1972. K&R C Em 1978, Brian Kernighan e Dennis Ritchie publicaram a primeira edio do livro The C Programming Language.5 Esse livro, conhecido pelos programadores de C como "K& R", serviu durante muitos anos como uma especificao informal da linguagem. A verso da linguagem C que ele descreve usualmente referida como "K&R C". A segunda edio d o livro cobriu o padro posterior, o ANSI C. K&R C introduziu as seguintes caracte rsticas na linguagem: Biblioteca padro de E/S Tipos de dado struct Tipos de dado long int Tipos de dado unsigned int O operador =+ foi alterado para +=, e =- para -= (o analisador lxico do compi lador fazia confuso entre i =+ 10 e i = +10. O mesmo acontecia com =-)

K&R C frequentemente considerado a parte mais bsica da linguagem, cujo suporte de ve ser assegurado por um compilador C. Durante muitos anos, mesmo aps a introduo do padro ANSI C, K&R C foi considerado o "menor denominador comum", em que programa dores de C se apoiavam quando uma portabilidade mxima era desejada, j que nem todo s os compiladores eram actualizados o bastante para suportar o padro ANSI C. Nos anos que se seguiram publicao do K&R C, algumas caractersticas "no-oficiais" for am adicionadas linguagem, suportadas por compiladores da AT&T e de outros vended ores. Estas incluam: Funes void e tipos de dados void * Funes que retornam tipos struct ou union Campos de nome struct num espao de nome separado para cada tipo struct Atribuio a tipos de dados struct Qualificadores const para criar um objecto s de leitura Biblioteca padro, que incorpora grande parte da funcionalidade implementada p or vrios vendedores Enumeraes Clculos de ponto-flutuante em preciso simples (no K&R C, os clculos intermedirio s eram feitos sempre em double, porque era mais eficiente na mquina onde a primei ra implementao do C foi feita) ANSI C e ISO C Durante os finais da dcada de 1970, a linguagem C comeou a substituir a linguagem BASIC como a linguagem de programao de microcomputadores mais usada. Durante a dcad a de 1980, foi adaptada para uso no PC IBM, e a sua popularidade comeou a aumenta r significativamente. Ao mesmo tempo, Bjarne Stroustrup, juntamente com outros n os laboratrios Bell, comeou a trabalhar num projecto onde se adicionavam construes d e linguagens de programao orientada por objectos linguagem C. A linguagem que eles produziram, chamada C++, nos dias de hoje a linguagem de programao de aplicaes mais comum no sistema operativo Windows da companhia Microsoft; C permanece mais pop ular no mundo Unix. Em 1983, o instituto norte-americano de padres (ANSI) formou um comit, X3J11, para estabelecer uma especificao do padro da linguagem C. Aps um processo longo e rduo, o padro foi completo em 1989 e ratificado como ANSI X3.159-1989 "Programming Langu age C". Esta verso da linguagem frequentemente referida como ANSI C. Em 1990, o p adro ANSI C, aps sofrer umas modificaes menores, foi adotado pela Organizao Internacio nal para Padronizao (ISO) como ISO/IEC 9899:1990, tambm conhecido como C89 ou C90. Um dos objetivos do processo de padronizao ANSI C foi o de produzir um sobreconjun to do K&R C, incorporando muitas das caractersticas no-oficiais subsequentemente i ntroduzidas. Entretanto, muitos programas tinham sido escritos e que no compilava m em certas plataformas, ou com um certo compilador, devido ao uso de biblioteca s de funes no-padro e ao fato de alguns compiladores no aderirem ao ANSI C. C99 Aps o processo da padronizao ANSI, as especificaes da linguagem C permaneceram relati vamente estticas por algum tempo, enquanto que a linguagem C++ continuou a evolui r. (em 1995, a Normative Amendment 1 criou uma verso nova da linguagem C mas esta verso raramente tida em conta.) Contudo, o padro foi submetido a uma reviso nos fi nais da dcada de 1990, levando publicao da norma ISO 9899:1999 em 1999. Este padro g eralmente referido como "C99". O padro foi adoptado como um padro ANSI em maro de 2 000. As novas caractersticas do C99 incluem: Funes em linha Remoo de restries sobre a localizao da declarao de variveis (como em C++) Adio de vrios tipos de dados novos, incluindo o long long int (para minimizar p roblemas na transio de 32-bits para 64-bits), um tipo de dado boolean explicito (c

hamado _Bool) e um tipo complex que representa nmeros complexos Vetores de dados de comprimento varivel (o vetor pode ter um tamanho diferent e a cada execuo de uma funo, mas no cresce depois de criado) Suporte oficial para comentrios de uma linha iniciados por //, emprestados da linguagem C++ Vrias funes de biblioteca novas, tais como snprintf() Vrios ficheiros-cabealho novos, tais como stdint.h O interesse em suportar as caractersticas novas de C99 parece depender muito das entidades. Apesar do GCC e vrios outros compiladores suportarem grande parte das novas caractersticas do C99, os compiladores mantidos pela Microsoft e pela Borla nd suportam pouqussimos recursos do C99, e estas duas companhias no parecem estar muito interessadas em adicionar tais funcionalidades, ignorando por completo as normas internacionais. A Microsoft parece preferir dar mais nfase ao C++.6 C11 Em 2007, se iniciou o trabalho em antecipao de outra reviso do padro de C, informalm ente chamada de C11 ou C1X. O comit dos padres de C adotou regras para limitar a i nsero de novos recursos que no tenham ainda sido testados por implementaes existentes .7 Em dezembro de 2011 foi publicada a verso estvel da especificao, como ISO/IEC 9899:2 011. Viso geral C uma linguagem imperativa e procedural, para implementao de sistemas. Seus pontos de design foram para ele ser compilado, fornecendo acesso de baixo nvel memria e baixos requerimentos do hardware. Tambm foi desenvolvido para ser uma linguagem d e alto nvel, para maior reaproveitamento do cdigo. C foi til para muitas aplicaes que foram codificadas originalmente em Assembly. Essa propriedade no foi acidental; a linguagem C foi criada com o objectivo princ ipal em mente: facilitar a criao de programas extensos com menos erros, recorrendo ao paradigma da programao procedural, mas sobrecarregando menos o autor do compil ador, cujo trabalho complica-se ao ter de realizar as caractersticas complexas da linguagem. Para este fim, a linguagem C possui as seguintes caractersticas: Uma linguagem extremamente simples, com funcionalidades no-essenciais, tais c omo funes matemticas ou manuseamento de ficheiros (arquivos), fornecida por um conj unto de bibliotecas de rotinas padronizada A focalizao no paradigma de programao procedural Um sistema de tipos simples que evita vrias operaes que no fazem sentido Uso de uma linguagem de pr-processamento, o pr-processador de C, para tarefas tais como a definio de macros e a incluso de mltiplos ficheiros de cdigo fonte Ponteiros do maior flexibilidade linguagem Acesso de baixo-nvel, atravs de incluses de cdigo Assembly no meio do programa C Parmetros que so sempre passados por valor para as funes e nunca por referncia ( p ossvel simular a passagem por referncia com o uso de ponteiros) Definio do alcance lexical de variveis Estruturas de variveis, (structs), que permitem que dados relacionados sejam combinados e manipulados como um todo Algumas caractersticas teis, que faltam em C, podem ser encontradas em outras ling uagens, que incluem: Segurana de tipo Coletor de lixo (mais comum em linguagens interpretadas) Vetores que crescem automaticamete Classes ou objetos com comportamento (ver Orientao a objetos) Closures

funes aninhadas Sobrecarga de operadores Meta-programao Apoio nativo de multithreading e comunicao por rede Apesar da lista de caractersticas teis que C possui no ser longa, isso no tem sido u m impedimento sua aceitao, pois isso permite que novos compiladores de C sejam esc ritos rapidamente para novas plataformas, e tambm permite que o programador perma nea sempre em controle do que o programa est a fazer. Isto o que por vrias vezes pe rmite o cdigo de C correr de uma forma mais eficiente que muitas outras linguagen s. Tipicamente, s cdigo de Assembly "afinado mo" que corre mais rapidamente, pois p ossui um controle completo da mquina, mas avanos na rea de compiladores juntamente com uma nova complexidade nos processadores modernos permitiram que a diferena te nha sido rapidamente eliminada. Uma consequncia da aceitao geral da linguagem C que frequentemente os compiladores, bibliotecas e at intrpretes de outras linguagens de nvel maior sejam eles prprios implementados em C. C tem como ponto forte, a sua eficincia, e a linguagem de programao preferida para o desenvolvimento de sistemas e softwares de base, apesar de tambm ser usada para desenvolver programas de computador. tambm muito usada no ensino de cincia da com putao, mesmo no tendo sido projetada para estudantes e apresentando algumas dificul dades no seu uso. Outra caracterstica importante de C, sua proximidade do cdigo de mquina, que permite que um projetista seja capaz de fazer algumas previses de com o o software ir se comportar, ao ser executado. C tem como ponto fraco, a falta de proteo que d ao programador. Praticamente tudo q ue se expressa em um programa em C, pode ser executado, como por exemplo, pedir o vigsimo membro de um vetor com apenas dez membros. Os resultados so muitas vezes totalmente inesperados, e os erros, difceis de encontrar. Tipos de dados C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem ALGO L, tais como Pascal. Possui tipos para nmeros inteiros de vrios tamanhos com e sem sinal, nmeros de ponto flutuante, caracteres e estruturas (structs). C usa exten sivamente ponteiros, um tipo muito simples de referncia que guarda o endereo de me mria da varivel. O ponteiro pode ser desreferenciado, uma operao que busca o objecto que se encontra na morada da memria que o ponteiro possui, morada essa que pode ser manipulada atravs de aritmtica de ponteiros. Durante o tempo de execuo, o pontei ro simplesmente uma morada de mquina tais como aquelas manipuladas em Assembly, m as em tempo de compilao possui um tipo complexo que indica o tipo do objecto para onde ele aponta, permitindo que se verifique o tipo de expresses, incluindo ponte iros. Os ponteiros so usados extensivamente em C. O tipo linha de texto de C simp lesmente um ponteiro para um vetor de caracteres e alocao dinmica de memria, descrit a abaixo, efectuada atravs de ponteiros. Os ponteiros em C possuem um valor reservado especial, NULL, que indica que no es to a apontar para uma morada. O uso desse valor como morada muito til na construo de vrias estruturas de dados, mas causa comportamento no-definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um ponteiro que possui o valor NULL c hamado ponteiro nulo. Os ponteiros so declarados (e desreferenciados) com um * (a sterisco), portanto o tipo int* denota um ponteiro para nmero(s) inteiro(s). A li nguagem C tambm fornece um tipo especial de ponteiros, o void*, que se traduz num ponteiro que aponta para um objecto de tipo desconhecido. A linguagem C tambm tem apoio a nvel de linguagem para vetores estticas (de dimenso fixa) de tipos. As disposies de tipos podem parecer ter mais que uma dimenso apesar de serem tecnicamente disposies de disposies de tipos. Em memria, tais estruturas so posicionadas com as linhas uma depois da outra (a alternativa seria armazenar os dados em colunas, usado em outras linguagens). O acesso a disposies de tipos feit o atravs de ponteiros e aritmtica de ponteiros; o nome da disposio tratado como se f

osse um ponteiro que aponta para o incio da disposio. Em certas aplicaes no razovel rem-se disposies de tipos de dimenso fixa e por isso a alocao dinmica de memria pode s r usada para criar disposies de tipos de dimenso varivel. Como a linguagem C regularmente usada em programao de baixo-nvel de sistemas, h caso s em que necessrio tratar um nmero inteiro como sendo um ponteiro, um nmero de pont o flutuante como sendo um nmero inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de "moldagem" (tambm denomin ado "converso de tipo" ou casting), uma operao que, caso seja possvel, fora a converso de um objecto de um tipo para outro. Apesar de ser por vezes necessrio, o uso de converses de tipo sacrifica alguma segurana oferecida pelo sistema de tipos. int O tipo de dado int (inteiro) serve para armazenar valores numricos inteiros. Exis tem vrios tipos de inteiros, cada um de um tamanho diferente (dependendo do siste ma operacional e/ou arquitetura do processador): int, pode possuir 16 bits, 32 bits ou 64 bits short int, deve possuir tamanho de no mnimo 16 bits e no pode ser maior que in t long int, deve possuir tamanho mnimo de 32 bits long long int, deve possuir tamanho mnimo de 64 bits Todos estes tipos de inteiros podem ainda ser declarados precedidos da clusula un signed, o que faz com que s suporte nmeros positivos. Isto faz com que, com o mesm o tamanho, uma varivel suporte mais nmeros positivos do que um signed (todos os in teiros so signed por omisso). char O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso si gnifica que o programa reserva um espao de 8 bits na memria RAM ou em registradore s do processador para armazenar um valor (char de tamanho maior que 8 bits permi tido pela linguagem, mas os casos so raros). Com vetores do tipo char possvel cria r cadeias de caracteres (strings). float O tipo de dado float serve para armazenar nmeros de ponto flutuante, ou seja, com casas decimais. O padro mais utilizado nos ltimos 10 anos o IEEE 754-1985. double O tipo de dado double serve para armazenar nmeros de ponto flutuante de dupla pre ciso, normalmente tem o dobro do tamanho do float e portanto o dobro da capacidad e. O padro mais adotado tambm o IEEE 754-1985. struct Em C podem ser usadas estruturas (chamados de registos em outras linguagens de p rogramao). As estruturas so grupos de variveis organizadas arbitrriamente pelo progra mador. Uma estrutura pode criar um novo tipo de varivel caso typedef seja usado e m sua declarao. Relaes com C++ A linguagem de programao C++ foi originalmente derivada do C para suportar program ao orientada a objetos. medida que as linguagens C e C++ foram evoluindo independe ntemente, a diviso entre as duas veio a aumentar. O padro C99 criou um nmero de car actersticas que entram em conflito. Hoje, as principais diferenas entre as duas li

nguagens so: inline - em C++, funes em linha encontram-se no espao global enquanto que em C encontram-se no espao local. Por outras palavras, isso significa que, em C++, qua lquer definio de qualquer funo em linha (sem ser a respeito da sobrecarga de funes de C++) tem de estar em conformidade com a "regra de uma definio" da linguagem C++. M as em C, a mesma funo em linha pode ser definida de maneira diferente em diferente s arquivos (ou ficheiros) A palavra-chave bool, igual usada em C++, em C99 necessita que se inclua o f icheiro-cabealho <stdbool.h> (_Bool est sempre disponvel). Padres anteriores de C no definiam um tipo booleano e vrios (e incompatveis) mtodos foram usados para simular um tipo booleano Algumas caractersticas originalmente desenvolvidas em C++ tambm apareceram em C. E ntre elas encontram-se:

prottipos de funo (com declarao de tipos de parmetros) e remoo do "int" implcito comentrios de linha, indicados por //; comentrios de linha terminam com um carc ter de nova-linha a palavra-chave inline tipagem mais forte Exemplos Programa Ol Mundo Ver artigo principal: Programa Ol Mundo A seguinte aplicao foi publicada na primeira edio de C de K&R, e tornou-se no progra ma de introduo padro da maior parte dos livros sobre C. O programa envia o texto "O l, Mundo!" para a sada padro, que normalmente o console, mas que tambm pode ser um f icheiro (ou arquivo), um outro dispositivo qualquer, ou at mesmo um bit bucket, d ependendo de como a sada-padro mapeada na altura em que o programa executado. int main() { printf("Ol, Mundo!\n"); } Apesar do programa acima correr corretamente, atualmente origina algumas mensage ns de aviso quando compilado com C ANSI. Essas mensagens podem ser eliminadas ef ectuando umas pequenas alteraes no programa original: #include <stdio.h> /* Pacotes com funes de entrada e sada */ int main(void) { printf("Ol, Mundo!\n"); return 0; /* Retorna 0, pois main retorna um int */ } /* Nova linha aps fechar a chave principal */ A primeira linha do programa uma diretiva de pr-processamento #include, que causa com que o pr-processador substitua aquela linha pela totalidade do contedo do arq uivo qual diretiva se refere. Neste caso o arquivo padro stdio.h (que contm prottip os de funes para trabalho com entrada e sada) ir substituir a linha. Os caracteres < e > indicam que o arquivo stdio.h encontra-se no local em que, quando da config urao do compilador, se definiu como padro para localizao dos ficheiros de incluso (hea der files, geralmente com a extenso .h). A linha (no-vazia) seguinte indica que uma funo denominada main ser definida. A funo m ain tem um significado especial nos programas de C, pois a funo que inicialmente e

xecutada ou em ingls entry point. Os caracteres { e } delimitam a extenso da funo. O termo int define a funo main como sendo uma funo que retorna um nmero inteiro. O ter mo void indica que a funo no aceita parmetros. A funo main, normalmente aceita parmetr s, que so passado pela linha de comando. Os compiladores e sistemas operacionais atuais reconhecem as seguintes declaraes de main: int main(int argc, char ** argv) int main(int argc, char * argv[]) A linha seguinte "chama", ou executa uma funo chamada printf; o arquivo includo, st dio.h, contm a informao que descreve a forma como a funo printf deve ser chamada. Nes ta chamada, passado funo printf um nico argumento, a linha de texto constante "Ol, M undo!\n". A funo printf retorna um valor, um int, mas como no usado ela descartada pelo compilador. O comando return retorna o valor 0 para o sistema, que interpre tado pelo mesmo como que a funo main() foi executada e encerrada com sucesso (sem erros). Por fim, o caracter } indica o fim da funo main. Note-se que texto rodeado por /* e */ (comentrios de texto) ignorado pelo compilador. Os compiladores que obedecem norma C99 tambm aceitam como comentrios as linhas de texto que so precedid os por //. Matemtica

O seguinte cdigo realiza seis operaes matemticas, adio, subtrao, multiplicao, divis enciao e radiciao, e em seguida envia os seus respectivos resultados para a sada padro (normalmente o console). #include <math.h> // necessria para pow() e sqrt() #include <stdio.h> // necessria para printf() e getchar() int main() { int a = 2, b = 3; printf("%d + %d = %d\n", a, b, a + b); printf("%d - %d = %d\n", a, b, a - b); printf("%d x %d = %d\n", a, b, a * b); printf("%d / %d = %0.1f\n", a, b, (float) a / b); // resultado fracionrio printf("%d elevado a %d = %0.1f\n", a, b, pow(a, b)); // pow(base, expoente) printf("raiz quadrada de %d = %0.1f\n", a, sqrt(a)); getchar(); //O uso dessa funo necessria apenas nos sistemas Windows, para manter o terminal (Prompt de comando) aberto return 0; } Estruturas de dados No exemplo seguinte, criada uma estrutura composta por 3 elementos de tipos dife rentes. Aps ser declarada uma varivel "x" do tipo struct "y", onde "y" o nome da e strutura, para se acessar os elementos usa-se a seguinte sintaxe: x.elemento. #include <stdio.h> struct Pessoa { char nome[64]; // vetor de 64 chars para o nome unsigned short int idade; char rg[13]; }; int main()

{ struct Pessoa exemplo = {"Fulano", 16, "00.000.000-00"}; // declarao da varivel "exemplo" printf("Nome: %s\n", exemplo.nome); printf("Idade: %hu\n", exemplo.idade); printf("RG: %s\n", exemplo.rg); getchar(); // desnecessrio, mas comumente utilizado em ambientes windows para "segurar" o terminal aberto return 0; } Ou, equivalente: #include <stdio.h> typedef struct Pessoa { char nome[64]; // vetor de 64 chars para o nome unsigned short int idade; char rg[13]; } Pessoa; int main() { Pessoa exemplo = {"Felipe", 16, "00.000.000-00"}; // declarao da varivel "exempl o" printf("Nome: %s\n", exemplo.nome); printf("Idade: %hu\n", exemplo.idade); printf("RG: %s\n", exemplo.rg); getchar(); return 0; } Baixo-nvel O exemplo que se segue apresenta cdigo C de baixo-nvel, as funes read e write. Neste programa vamos ler de N para buf, blocos de bufsize neste caso 1024, para O. Qu ando n<=0 porque a leitura acabou, sai do ciclo while e libera a memria ocupada p or buf. #include <unistd.h> #define bufsize 1024; int main(void) { int N,n,O; char *buf; buf = (char*) malloc (bufsize); while(n=read(N, buf, bufsize)) write(O, buf,n) free(buf); return 0; }

Ferramentas de programao Bloodshed Dev-C++ Code::Blocks GNU Compiler Collection Make Ver tambm Outros projetos Wikimedia tambm contm material sobre este tema: Wikilivros Livros e manuais no Wikilivros Linguagem compilada Linguagem de programao Linguagem de programao de alto nvel Lista de linguagens de programao Unix Compilador Referncias ? History of the C Programming Language (em ingls). Pgina visitada em 23 de ma io de 2010. ? Programming Language Popularity (em ingls). Pgina visitada em 23 de maio de 2010. ? TIOBE Programming Community Index (em ingls). Pgina visitada em 23 de maio d e 2010. ? C The Influence Factor of Many Popular Programming Languages (em ingls). Pgi na visitada em 23 de maio de 2010. ? Kernighan, Brian W.; Ritchie, Dennis M. The C Programming Language (em ing ls). Upper Saddle River, New Jersey: Prentice hall, 1978. 228 p. ISBN 0-13-110163 -3 ? Microsoft d mais nfase ao C++ (em ingls). Pgina visitada em 23 de maio de 2010 . ? Grupo de trabalho do ISO C (em ingls). Pgina visitada em 23 de maio de 2010. Ligaes externas Pgina oficial do ISO C Working Group (em ingls) C no Open Directory Project [Expandir] v e Principais linguagens de programao Ver avaliaes Avaliar esta pgina

Você também pode gostar