Вы находитесь на странице: 1из 12

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

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 uma ou mais fontes fiveis e


independentes, mas ela(s) no cobre(m) todo o texto (desde
agosto de 2013).
Por favor, melhore este artigo providenciando mais fontes fiveis e
independentes e inserindo-as em notas de rodap ou no corpo do texto,
conforme o livro de estilo.
Encontre fontes: Google notcias, livros, acadmico Scirus Bing. Veja como referenciar e
citar as fontes.

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 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 companhia
Microsoft; 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

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

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
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 ao
paradigma 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)

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 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

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 (structs). 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 criar
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
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++


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
ficheiro-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. 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
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


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 um bit 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

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

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
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;
}

Linguagem de programao de alto nvel como se chama, na Cincia da


Computao de linguagens de programao, uma linguagem com um nvel de abstrao
relativamente elevado, longe do cdigo de mquina e mais prximo linguagem
humana. Desse modo, as linguagens de alto nvel no esto diretamente relacionadas
arquitetura do computador. O programador de uma linguagem de alto nvel no precisa
conhecer caractersticas do processador, como instrues e registradores. Essas
caractersticas so abstradas na linguagem de alto nvel.

Por se tratar de uma classificao subjetiva, isto , sem limites bem definidos, no
possvel afirmar que "determinada linguagem pode ser mais humana que outra". Apesar
disso, por questo de praticabilidade e objetividade, a classificao geralmente se limita
em "linguagem de alto nvel" e "linguagem de baixo nvel".

Alguns exemplos de linguagens de alto nvel:

ASP

ActionScript

C/C++

C#
Pascal/Object Pascal

Euphoria

Java

Lua

MATLAB

PHP

Python

Ruby

Tcl

Basic/Visual Basic