You are on page 1of 11

C (linguagem de programao)

C uma linguagem de programao compilada de propsito


geral, estruturada, imperativa, procedural, padronizada pela ISO, criada em 1972,
por Dennis Ritchie, no AT&T Bell Labs, para desenvolver o sistema operacional Unix (que
foi originalmente escrito 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
linguagens de programao,4 mais notavelmente C++, que originalmente comeou como
uma extenso para C.

ndice
[esconder]

1 Histria
1.1 C K&R
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[editar | editar cdigo-fonte]

Ken Thompson e Dennis Ritchie (da esquerda para direita), os criadores das linguagens B e C,
respectivamente.

O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973.5 de acordo
com Ritchie, o perodo mais criativo ocorreu em 1972. A linguagem foi chamada "C",
porque suas caractersticas foram obtidas a partir de uma linguagem anteriormente
chamado de " B", que de acordo com a Ken Thompson era verso reduzida da linguagem
de programao BCPL.6
A verso original PDP-11 do sistema Unix foi desenvolvido em assembly. Em1973, com a
adio dos tipos struct , a linguagem C tornou-se poderosa o suficiente para que a maior
parte do kernel do Unix fosse reescrito em C. Este foi um dos primeiros ncleos de
sistemas operacionais implementadas em uma linguagem diferente da
linguagem Assembly. Em 1977, foram feitas novas mudanas por Ritchie e Stephen C.
Johnson para facilitar a portabilidade do sistema operacional Unix. O Portable C
Compiler de Johnson serviu de base para vrias implementaes de C em novas
plataformas.7

C K&R[editar | editar cdigo-fonte]


A linguagem C no teve sucesso imediato aps sua criao e seu uso ficou restrito a
alguns laboratrios mas em 1978 Brian Kerningham e Dennis Rithcie lanam o livro The C
Programming Language.8 que serviu de tutorial e mudou a histria da programao em C,
de fato essa primeira verso da linguagem conhecida como "C Kernigham e Ritchie" ou
apenas "C K&R".9
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 do livro cobriu o padro
posterior, o ANSI C. K&R C introduziu as seguintes caractersticas 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 compilador
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 deve
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

programadores de C se apoiavam quando uma portabilidade mxima era desejada, j que


nem todos 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"
foram adicionadas linguagem, suportadas por compiladores da AT&T e de outros
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 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 por vrios
vendedores
Enumeraes

Clculos de ponto-flutuante em preciso simples (no K&R C, os clculos intermedirios


eram feitos sempre em double , porque era mais eficiente na mquina onde a primeira
implementao do C foi feita)

Este artigo ou se(c)o cita fontes confiveis e independentes, mas que no


cobrem todo o contedo (desde agosto de 2013). Por favor, adicione mais referncias
e insira-as corretamente no texto ou no rodap. Material sem fontes poder
serremovido.
Encontre fontes: Google (notcias, livros e acadmico)

ANSI C e ISO C[editar | editar cdigo-fonte]


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 dcada de 1980, foi adaptada para uso no PC IBM, e a sua popularidade
comeou a aumentar significativamente. Ao mesmo tempo, Bjarne Stroustrup, juntamente
com outros nos laboratrios Bell, comeou a trabalhar num projecto onde se adicionavam
construes de 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
companhiaMicrosoft; C permanece mais popular 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
Language C". Esta verso da linguagem frequentemente referida como ANSI C. Em 1990,
o padro ANSI C, aps sofrer umas modificaes menores, foi adotado pela Organizao
Internacional 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 sobreconjunto do K&R C, incorporando muitas das caractersticas no-oficiais
subsequentemente introduzidas. Entretanto, muitos programas tinham sido escritos e que
no compilavam em certas plataformas, ou com um certo compilador, devido ao uso de
bibliotecas de funes no-padro e ao fato de alguns compiladores no aderirem ao ANSI

C.

C99[editar | editar cdigo-fonte]


Aps o processo da padronizao ANSI, as especificaes da linguagem C permaneceram
relativamente estticas por algum tempo, enquanto a linguagem C++ continuou a evoluir.
(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
finais da dcada de 1990, levando publicao da norma ISO 9899:1999 em 1999. Este
padro geralmente referido como "C99". O padro foi adoptado como um padro ANSI
em maro de 2000. 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
problemas na transio de 32-bits para 64-bits), um tipo de dado boolean explicito
(chamado _Bool) e um tipo complex que representa nmeros complexos

Vetores de dados de comprimento varivel (o vetor pode ter um tamanho diferente 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 Borland 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++.10

C11[editar | editar cdigo-fonte]


Em 2007, se iniciou o trabalho em antecipao de outra reviso do padro de C,
informalmente chamada de C11 ou C1X. O comit dos padres de C adotou regras para
limitar a insero de novos recursos que no tenham ainda sido testados por
implementaes existentes.11
Em dezembro de 2011 foi publicada a verso estvel da especificao, como ISO/IEC
9899:2011.

Viso geral[editar | editar cdigo-fonte]


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 de 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 principal em
mente: facilitar a criao de programas extensos com menos erros, recorrendo

aoparadigma da programao procedural, mas sobrecarregando menos o autor


do compilador, 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 como


funes matemticas ou manuseamento de ficheiros (arquivos), fornecida por um conjunto
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 (
possvel 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
linguagens, 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)


Clausuras
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 um
impedimento sua aceitao, pois isso permite que novos compiladores de C sejam
escritos rapidamente para novas plataformas, e tambm permite que o programador
permanea sempre em controle do que o programa est a fazer. Isto o que por vrias
vezes permite o cdigo de C correr de uma forma mais eficiente que muitas outras
linguagens. Tipicamente, s cdigo de Assembly "afinado mo" que corre mais
rapidamente, pois possui um controle completo da mquina, mas avanos na rea de
compiladores juntamente com uma nova complexidade nos processadores modernos
permitiram que a diferena tenha 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
computao, mesmo no tendo sido projetada para estudantes e apresentando algumas

dificuldades 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
como o software ir se comportar, ao ser executado.
C tem como ponto fraco, a falta de proteo que d ao programador. Praticamente tudo
que 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[editar | editar cdigo-fonte]


C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem ALGOL,
tais como Pascal. Possui tipos para nmeros inteiros de vrios tamanhos com e sem
sinal, nmeros de ponto flutuante, caracteres e estruturas ( struct s). C usa
extensivamente ponteiros, um tipo muito simples de referncia que guarda o endereo
de memria 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
ponteiro simplesmente uma morada de mquina tais como aquelas manipuladas
em Assembly, mas 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
ponteiros. Os ponteiros so usados extensivamente em C. O tipo linha de texto de C
simplesmente um ponteiro para um vetor de caracteres e alocao dinmica de memria,
descrita abaixo, efectuada atravs de ponteiros.
Os ponteiros em C possuem um valor reservado especial, NULL , que indica que no esto
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
chamado ponteiro nulo. Os ponteiros so declarados (e desreferenciados) com
um * (asterisco), portanto o tipo int* denota um ponteiro para nmero(s) inteiro(s). A
linguagem 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 feito atravs de ponteiros e aritmtica de ponteiros; o nome da
disposio tratado como se fosse um ponteiro que aponta para o incio da disposio. Em
certas aplicaes no razovel usarem-se disposies de tipos de dimenso fixa e por
isso a alocao dinmica de memria pode ser usada para criar disposies de tipos de
dimenso varivel.
Como a linguagem C regularmente usada em programao de baixo-nvel de sistemas,
h casos em que necessrio tratar um nmero inteiro como sendo um ponteiro, um

nmero de ponto 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 denominado "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. Existem
vrios tipos de inteiros, cada um de um tamanho diferente (dependendo do sistema
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 int
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 unsigned,
o que faz com que s suporte nmeros positivos. Isto faz com que, com o mesmo
tamanho, uma varivel suporte mais nmeros positivos do que um signed (todos os
inteiros so signed por omisso).
char
O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso significa que
o programa reserva um espao de 8 bits na memria RAM ou em registradores do
processador para armazenar um valor (char de tamanho maior que 8 bits permitido pela
linguagem, mas os casos so raros). Com vetores do tipo char possvel criarcadeias 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
preciso, normalmente tem o dobro do tamanho do float e portanto o dobro da
capacidade. O padro mais adotado tambm o IEEE 754-1985.
struct
Em C podem ser usadas estruturas (chamados de registos em outras linguagens de
programao). As estruturas so grupos de variveis organizadas arbitrriamente pelo
programador. Uma estrutura pode criar um novo tipo de varivel caso typedef seja usado
em sua declarao.

Relaes com C++[editar | editar cdigo-fonte]


A linguagem de programao C++ foi originalmente derivada do C para suportar
programao orientada a objetos. medida que as linguagens C e C++ foram evoluindo
independentemente, a diviso entre as duas veio a aumentar. O padro C99 criou um
nmero de caractersticas que entram em conflito. Hoje, as principais diferenas entre as
duas linguagens 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++, qualquer
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++.
Mas em C, a mesma funo em linha pode ser definida de maneira diferente em diferentes
arquivos (ou ficheiros)

A palavra-chave bool , igual usada em C++, em C99 necessita que se inclua o ficheirocabealho <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.
Entre 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 carcter


de nova-linha

a palavra-chave inline
tipagem mais forte

Exemplos[editar | editar cdigo-fonte]


Programa Ol Mundo[editar | editar cdigo-fonte]
Ver artigo principal: Programa Ol Mundo
A seguinte aplicao foi publicada na primeira edio de C de K&R, e tornou-se no
programa de introduo padro da maior parte dos livros sobre C. O programa envia o
texto "Ol, Mundo!" para a sada padro, que normalmente o console, mas que tambm
pode ser um ficheiro (ou arquivo), um outro dispositivo qualquer, ou at mesmo umbit
bucket, dependendo de como a sada-padro mapeada na altura em que o programa
executado.
int main(void)
{
puts("Ol, Mundo!");
}
Apesar do programa acima correr corretamente, atualmente origina algumas mensagens
de aviso quando compilado como C ANSI. Essas mensagens podem ser eliminadas
efectuando umas pequenas alteraes no programa original:

#include <stdio.h> /* Pacotes com funes de entrada e sada */


int main(void)
{
puts("Ol, Mundo!");
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 arquivo
qual diretiva se refere. Neste caso o arquivo padro stdio.h (que contm prottipos 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
configurao do compilador, se definiu como padro para localizao dos ficheiros de
incluso (header files, geralmente com a extenso .h).
A linha (no-vazia) seguinte indica que uma funo denominada main ser definida. A
funo main tem um significado especial nos programas em C, pois a funo que
inicialmente executada (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 termo void indica que a funo no aceita parmetros. A
funo main, normalmente aceita parmetros, que so passado pela linha de comando. Os
compiladores e sistemas operacionais atuais reconhecem as seguintes declaraes de
main:
int main(void);
int main(int argc, char *argv[]);
int main(int argc, char **argv);
A linha seguinte "chama", ou executa uma funo chamada puts ; o arquivo
includo, stdio.h , contm a informao que descreve a forma como a funo puts deve
ser chamada. Nesta chamada, passado funo printf um nico argumento, a linha
de texto constante "Ol, Mundo!". A funo puts retorna um valor, um int , mas como
no usado, descartado pelo compilador. O comando return retorna o valor 0 para o
sistema, que interpretado 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 precedidos por // .

Matemtica[editar | editar cdigo-fonte]


O seguinte cdigo realiza seis operaes
matemticas, adio, subtrao, multiplicao, diviso, exponenciao 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[editar | editar cdigo-fonte]


No exemplo seguinte, criada uma estrutura composta por 3 elementos de tipos
diferentes. Aps ser declarada uma varivel "x" do tipo struct "y", onde "y" o nome da
estrutura, 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 "exemplo"
printf("Nome: %s\n", exemplo.nome);
printf("Idade: %hu\n", exemplo.idade);
printf("RG: %s\n", exemplo.rg);
getchar();
return 0;
}

Baixo-nvel[editar | editar cdigo-fonte]


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. Quando n
for igual a 0, porque a leitura acabou, sai do ciclo while e libera a memria ocupada por
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;
}

You might also like