𝖂𝖎ƙ𝖎𝖊

C (linguagem de programação): mudanças entre as edições

imported>Rafael Vargas
m (conserto de link)
imported>Oculosdanilo
(Correção de parênteses)
 
Linha 1: Linha 1:
A '''linguagem de programação C''' é uma [[linguagem de programação]] de baixo nível e [[padrão|padronizada]] criada na década de [[1970]] por [[Ken Thompson]] e [[Dennis Ritchie]] para ser usada no [[sistema operativo]] [[UNIX]]. Desde então espalhou-se por muitos outros sistemas operativos, e tornou-se numa das linguagens de programação mais usadas.
{{Ver desambig||C (desambiguação)}}
C tem como ponto-forte a sua eficiência e é a linguagem de programação de preferência para o desenvolvimento de '''software de sistemas''', apesar de também ser usada para desenvolver [[aplicação|aplicações]]. É também muito usada no ensino de [[ciência da computação|ciências da computação]], mesmo não tendo sido projectada para novatos. <!-- melhor expressão se faz favor -->
{{Mais fontes|Este artigo|tec|data=agosto de 2013}}
{{Info/Linguagem de computador
|nome            = C
|paradigma        = [[programação estruturada]]<br />[[programação imperativa]]<br />[[programação procedural]]
|ano              = {{ani|1972}}
|ultima_versao    = C17
|ultima_data      = {{Data de lançamento|2018|06}}
|versao_beta      = [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf C2x]
|beta_data        = {{Data de lançamento|2020|12|11}}
|criador          = [[Dennis Ritchie]]
|tipagem          =
* estática
* fraca
|compiladores    =
* Borland C
* [[Clang]]
* [[GNU Compiler Collection|GNU GCC]]
* [[Visual C++|MSVC]]
* [[Turbo C]]
* Watcom C
* Tiny C Compiler
|dialetos        =
* Cyclone
* Unified Parallel C
* Split-C
* Cilk
* C*
|influenciada_por =
* [[ALGOL|ALGOL 68]]
* [[Linguagem assembly|Assembly]]
* [[B (linguagem de programação)|B]]
* [[BCPL]]
* CPL
* [[Fortran]]
* [[PL/I]]
|influenciou      =
* [[AWK]]
* [[BitC]]
* [[C++]]
* [[C Sharp|C#]]
* [[Csh|C Shell]]
* [[D (linguagem de programação)|D]]
* [[Euphoria (linguagem de programação)|Euphoria]]
* [[Go (linguagem de programação)|Go]]
* [[Java (linguagem de programação)|Java]]
* [[JavaScript]]
* [[Limbo (linguagem de programação)|Limbo]]
* [[Logic Basic]]
* [[Objective-C]]
* [[Perl]]
* [[PHP]]
* [[Python]]
* [[Vala (linguagem de programação)|Vala]]
* [[Zig (linguagem de programação)|Zig]]
|licença          =
|extensão        =
* .c
* .h<ref>{{Citar web |url=https://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Overall-Options.html |título=Overall Options - Using the GNU Compiler Collection (GCC) |língua=inglês |site=gcc.gnu.org |acessodata=13 de dezembro de 2017}}</ref>
}}
'''C'''<ref>{{Citar web|url=https://www.iso.org/standard/74528.html|titulo=ISO/IEC 9899:2018|acessodata=2018-11-08|obra=ISO|lingua=en}}</ref> é uma [[Linguagem compilada|linguagem de programação compilada]] de propósito geral, [[Programação estruturada|estruturada]], [[Programação imperativa|imperativa]], [[Programação procedural|procedural]], [[Padrão|padronizada]] pela [[ISO org|Organização Internacional para Padronização]] (ISO), criada em 1972 por [[Dennis Ritchie]] na empresa [[AT&T]] [[Bell Labs]] para desenvolvimento do [[Sistema operativo|sistema operacional]] [[Unix]] (originalmente escrito em [[Linguagem de montagem|Assembly]]).<ref name="unix">{{Citar web |url=http://www.livinginternet.com/i/iw_unix_c.htm |título=History of the C Programming Language |publicado=livinginternet.com |língua=inglês |acessodata=23 de maio de 2010}}</ref>


==Características==
C é uma das [[linguagens de programação ]]mais populares<ref>{{Citar web |url=http://www.langpop.com/ |título=Programming Language Popularity |publicado=langpop.com |língua=inglês |acessodata=23 de maio de 2010}}</ref><ref>{{Citar web |url=http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html |título=TIOBE Programming Community Index |publicado=tiobe.com |língua=inglês |acessodata=23 de maio de 2010}}</ref> e existem poucas arquiteturas para as quais não existem [[Compilador|compiladores]] para C. C tem influenciado muitas outras linguagens de programação (por exemplo, a linguagem [[Java (linguagem de programação)|Java]]),<ref>{{Citar web |url=http://www.cprogramminglanguage.com/c-the-influence-factor-of-many-popular-programming-languages/ |título=C – The Influence Factor of Many Popular Programming Languages |publicado=cprogramminglanguage.com |língua=inglês |acessodata=23 de maio de 2010}}</ref> mais notavelmente [[C++]], que originalmente começou como uma extensão para C.
===Conceitos gerais=== <!-- substitui "overview". Será o melhor termo? -->
C é uma [[linguagem de programação]] relativamente minimalista que opera próximo do hardware, e é mais semelhante à linguagem [[assembly]] do que as restantes linguagens. Certamente, C é por vezes referida como uma "assembly portátil". <!-- reflecting its important difference from assembly languages--> O código de C pode ser compilado para e corrido <!-- êh? --> em quase todos os computadores. C é típicamente chamada de uma linguagem de ''baixo nível'' ou de ''nível médio'', indicando assim o quanto perto ela opera com o hardware.
Essa propriedade não foi acidental; C foi criada com um objectivo em mente: facilitar a criação de programas extensos com menos erros recorrendo ao paradigma da [[programação algorítmica]] ou procedimental, mas sem nunca sobrecarregar <!-- procurar termo melhor --> o autor do [[compilador]] de C, cujo trabalho complica-se ao ter de realizar as características complexas da linguagem. <!-- será que esta frase foi bem conseguida? --> Para este fim, a linguagem '''C''' possui as seguintes características:
* Uma [[linguagem nuclear]] extremamente simples, com funcionalidades não-essenciais, tal como funções matemáticas ou manuseamento de ficheiros, fornecida por um conjunto de [[biblioteca de rotinas]] padronizada. <!-- não será melhor o termo "normalizada" ? -->
* A focalização no paradigma de [[programação procedimental]] <!-- com facilidades para a programação num estilo estruturado -->
* Um [[sistema de tipos]] simples que evita várias operações que não fazem sentido
* Uso de uma linguagem de [[pré-processador|pré-processamento]], o '''pré-processador de C''', para tarefas tais como a definição de [[macros]] e a inclusão de múltiplos ficheiros de [[código fonte]].
* Um acesso de baixo-nível à '''memória do computador''', através do uso de [[ponteiros]].
* Parãmetros que são sempre passados por valor para as funções e nunca por referência.
* definição do '''alcance lexical de variáveis'''
* Registos, <!-- falta definição --> (structs), que permite que dados relacionados sejam combinados e manipulados como um todo


Algumas características úteis que faltam à linguagem C mas que são encontradas noutras linguagens incluem:
A linguagem C encontra-se na versão/padrão internacional C17 (ISO/IEC 9899:2018) lançada em junho de 2018, substituindo a versão C11 (ISO/IEC 9899:2011),<ref>{{Citar web|url=http://www.iso-9899.info/wiki/The_Standard|titulo=The Standard - C|data=|acessodata=2018-11-08|obra=ISO|publicado=|ultimo=|primeiro=|lingua=en}}</ref> disponível em ISO e IEC e com suporte para [[GNU Compiler Collection|GCC8]] e [[Clang]] [[Low Level Virtual Machine|LLVM6]].<ref>{{Citar web|url=https://www.phoronix.com/scan.php?page=news_item&px=LLVM-Clang-C17-Support|titulo=Initial C17 Language Support Lands In LLVM Clang 6.0 SVN - Phoronix|data=|acessodata=2018-11-08|obra=Phoronix|publicado=|ultimo=|primeiro=|lingua=en}}</ref>
* [[Segurança de tipo]]
* [[Colecta automática de lixo]]
* [[Classes]] ou [[objectos]] com comportamento (ver [[programação orientada por objectos]]
* um sistema avançado de sistema de tipos
<!-- *  Closures -->
* [[Funções aninhadas]]
* [[Programação genérica]]
* [[Sobrecarga de operadores]]
* [[Meta-programação]]
* Apoio nativo de '''multithreading''' e '''networking''' <!-- por favor traduzir -->


Apesar da lista de características úteis que C não possui ser longa, isso não tem sido um impedimento à sua aceitação, pois isso permite que novos compiladores de C sejam escritos rapidamente para novas plataformas, e também permite que o programador permaneça sempre em controle do que o programa está a fazer. Isto é o que por várias vezes permite o código de C correr de uma forma mais eficiente que muitas outras linguagens. Tipicamente, só código de assembly "afinado à mão" é que corre mais rapidamente, pois possui um controle completo da máquina, mas avanços na área de compiladores juntamente com uma nova complexidade nos processadores modernos permitiram que a diferença tenha sido rapidamente eliminada.
== História ==
Uma consequência da aceitação geral da linguagem C é que frequentemente os compiladores, bibliotecas e até intérpretes de outras linguagens de nivel maior sejam eles próprios implementados em C.
[[Imagem:Ken Thompson and Dennis Ritchie.jpg|300px|thumb|[[Ken Thompson]] e [[Dennis Ritchie]] (da esquerda para direita), os criadores das linguagens [[B (linguagem de programação)|B]] e '''C''', respectivamente]]
O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973.<ref name="dottcl">{{Citar web|url=http://cm.bell-labs.com/cm/cs/who/dmr/chist.html |título=The Development of the C Language |citação=The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. |último=Ritchie |primeiro=Dennis M. |autorlink=Dennis Ritchie |data= janeiro de 1993|acessodata=1 de janeiro de 2008}}</ref> de acordo com Ritchie, o período mais criativo ocorreu em 1972. A linguagem foi chamada "C", porque suas características foram obtidas a partir de uma linguagem anteriormente chamada de "[[B (linguagem de programação)|B]]", que de acordo com [[Ken Thompson]] era a versão reduzida da linguagem de programação [[BCPL]].<ref>[http://www.le.ac.uk/users/rjm1/cotter/page_06.htm A Brief History of C]</ref>


==="Olá, Mundo!" em C===
A versão original PDP-11 do sistema Unix foi desenvolvido em [[assembly]].  Em 1973, com a adição dos tipos <code>struct</code>, 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 núcleos de sistemas operacionais implementados numa linguagem diferente da linguagem ''Assembly''. Em 1977, foram feitas novas mudanças por Ritchie e Stephen C. Johnson para facilitar a portabilidade do sistema operacional Unix. O ''Portable C Compiler'' de Johnson serviu de base para várias implementações de C em novas plataformas.<ref name="unixport">{{citar periódico |último1 =Johnson |primeiro1 =S. C. |authorlink1=Stephen C. Johnson |último2 =Ritchie |primeiro2 =D. M. |authorlink2=Dennis Ritchie |título=Portability of C Programs and the UNIX System |periódico=Bell System Tech. J. |ano=1978 |volume=57 |número=6 |páginas=2021–2048 |url=http://cm.bell-labs.com/cm/cs/who/dmr/portpap.pdf |acessodata=16 de dezembro de 2012}}</ref>
A seguinte aplicação foi publicada na primeira edição de C de K&R, e tornou-se no programa de introdução padrão da maior parte dos livros sobre C. O programa envia o texto "[[Programa Olá Mundo|Olá, Mundo!]]" para a [[saída padrão]] (que é normalmente o ecrâ, mas também pode ser um ficheiro, um outro dispositivo qualquer ou até mesmo um [[bit bucket]] <!-- traduzam, por favor -->, dependendo de como a saída-padrão é mapeada na altura em que o programa é executado.


<pre>
=== C K&R ===
<nowiki>
A linguagem C não teve um sucesso imediato após a sua criação e o seu uso ficou restrito a alguns laboratórios,<ref>{{citar web|url = http://www.gotw.ca/publications/c_family_interview.htm|título = Entrevista com Dennis Ritchie, Bjarne Stroustrup e James Gosling|lingua={{en}}|data=julho de 2000|acessodata= 3 de junho de 2015|publicado= Java Report e C++ Report}}</ref> mas em 1978 [[Brian Kernighan]] e Dennis Ritchie lançam o livro ''[[The C Programming Language]]''.<ref name="kernighan">{{Citar livro|autor=Kernighan, Brian W.; Ritchie, Dennis M|título=The C Programming Language|subtítulo=|idioma=inglês|local=Upper Saddle River, New Jersey|editora=Prentice hall|ano=1978|páginas=228|isbn=0-13-110163-3}}</ref> que serviu de tutorial e mudou a história da programação em C. De fato essa primeira versão da linguagem é conhecida como "C Kernigham e Ritchie" ou apenas "C K&R".<ref name="HICKSON">{{citar livro|autor =Rosangle Hickson|título=Aprenda a programa em C, C++ e C#|url=http://books.google.com/books?id=phxP6FTc0p4C&pg=PA3|edição=2a|publicado=Campus|isbn=978-85-352-1479-6|página=3}}</ref>
main()
 
Esse livro, conhecido pelos programadores de C como "K&R", serviu durante muitos anos como uma especificação informal da linguagem. A versão da linguagem C que ele descreve é usualmente referida como "'''K&R C'''". A segunda edição do livro cobriu o padrão posterior, o ''ANSI C''. K&R C introduziu as seguintes características na linguagem:
 
* Biblioteca padrão de [[Entrada/saída|E/S]]
* Tipo de dados <code>struct</code>
* Tipo de dados <code>long int</code>
* Tipo de dados <code>unsigned int</code>
* O operador <code>=+</code> foi alterado para <code>+=</code>, e <code>=-</code> para <code>-=</code> (o [[Análise léxica|analisador léxico]] do compilador fazia confusão entre <code>i =+ 10</code> e <code>i = +10</code>. O mesmo acontecia com <code>=-</code>)
 
K&R C é frequentemente considerado a parte mais básica da linguagem, cujo suporte deve ser assegurado por um [[compilador]] de C. Durante muitos anos, mesmo após a introdução do padrão ANSI C, K&R C foi considerado o "menor denominador comum", em que programadores de C se apoiavam quando uma [[Portabilidade (informática)|portabilidade]] máxima era desejada, já que nem todos os compiladores eram actualizados o suficiente para suportar o padrão ANSI C.
 
Nos anos que se seguiram à publicação do K&R C, algumas características "não oficiais" foram adicionadas à linguagem, suportadas por compiladores da AT&T e de outros vendedores. Estas incluíam:
 
* Funções <code>void</code> e tipos de dados <code>void *</code>
* Funções que retornam tipos <code>struct</code> ou <code>union</code>
* Campos de nome <code>struct</code> num espaço de nome separado para cada tipo <code>struct</code>
* Atribuição a tipos de dados <code>struct</code>
* Qualificadores <code>const</code> para criar um objecto só de leitura
* Biblioteca padrão, que incorpora grande parte da funcionalidade implementada por vários vendedores
* Enumerações
* Cálculos de ponto-flutuante em precisão simples (no K&R C, os cálculos intermediários eram feitos sempre em <code>double</code>, porque era mais eficiente na máquina onde a primeira implementação do C foi feita)
 
=== ANSI C e ISO C ===
Durante os finais da década de 1970, a linguagem C começou a substituir a linguagem [[BASIC]] como a linguagem de programação de [[Computador doméstico|microcomputadores]] mais usada. Durante a década de 1980, foi adaptada para uso no PC IBM, e a sua popularidade começou a aumentar significativamente. Ao mesmo tempo, [[Bjarne Stroustrup]], juntamente com outros nos laboratórios Bell, começou a trabalhar num projecto onde se adicionavam extras para programação orientada por objectos à linguagem C. A linguagem que eles produziram, chamada [[C++]], é nos dias de hoje a linguagem de programação de aplicações mais comum no sistema operativo [[Microsoft Windows|Windows]] da companhia [[Microsoft]]. A linguagem C permanece a mais popular no mundo [[Unix]].
 
Em 1983, o instituto norte-americano de padrões ([[American National Standards Institute|ANSI]]) formou um comité, X3J11, para estabelecer uma especificação do padrão da linguagem C. Após um processo longo e árduo, o padrão foi completo em 1989 e ratificado como ANSI X3.159-1989 "Programming Language C". Esta versão da linguagem é frequentemente referida como ANSI C. Em 1990, o padrão ANSI C, após sofrer umas modificações menores, foi adotado pela [[Organização Internacional para Padronização]] (ISO) que cria o grupo de trabalho para cuidar da especificação da linguagem, denominado WG14, assim foi renomeada para ISO/IEC 9899:1990, também conhecido como C89 e C90.<ref>{{Citar web|url=https://www.mentebinaria.com.br/artigos/especifica%C3%A7%C3%B5es-da-linguagem-c-r17/|titulo=Especificações da linguagem C|acessodata=2018-11-08|obra=Mente Binária|lingua=pt-BR}}</ref> Um dos objetivos do processo de padronização ANSI C foi o de produzir um sobreconjunto do K&R C, incorporando muitas das características não oficiais subsequentemente introduzidas. Entretanto, muitos programas tinham sido escritos e que não compilavam em certas plataformas, ou com um certo compilador, devido ao uso de bibliotecas de funções não padrão e ao fato de alguns compiladores não aderirem ao ANSI C.
 
=== C99 ===
Após o processo da padronização ANSI, as especificações da linguagem C permaneceram relativamente estáticas por algum tempo, enquanto a linguagem C++ continuou a evoluir. (em 1995, a ''Normative Amendment 1'' criou uma versão nova da linguagem C mas esta versão raramente é tida em conta.) Contudo, o padrão foi submetido a uma revisão nos finais da década de 1990, levando à publicação da norma '''ISO 9899:1999''' em 1999. Este padrão é geralmente referido como "C99" e foi adoptado como um padrão ANSI em março de 2000. As novas características do C99 incluem:
 
* Funções em linha
* Remoção de restrições sobre a localização da declaração de variáveis (como em C++)
* Adição de vários tipos de dados novos, incluindo o <code>long long int</code> (para minimizar problemas na transição de 32-bits para 64-bits), um tipo de dados boolean explicito (chamado ''_Bool'') e um tipo <code>complex</code> que representa [[Número complexo|números complexos]]
* [[Array|Vetores]] de dados de comprimento variável (o vetor pode ter um tamanho diferente a cada execução de uma função, mas não cresce depois de criado)
* Suporte oficial para comentários de uma linha iniciados por <code>//</code>, emprestados da linguagem C++
* Várias funções de biblioteca novas, tais como <code>snprintf()</code>
* Vários ficheiros-cabeçalho novos, tais como <code>stdint.h</code>
 
O interesse em suportar as características novas de C99 parece depender muito das entidades. Apesar do [[GNU Compiler Collection|GCC]] e vários outros compiladores suportarem grande parte das novas características do C99, os compiladores mantidos pela Microsoft e pela [[Borland]] suportam pouquíssimos recursos do C99, e estas duas companhias não parecem estar muito interessadas em adicionar tais funcionalidades, ignorando por completo as normas internacionais. A Microsoft parece preferir dar mais ênfase ao C++.<ref>{{Citar web |url=http://connect.microsoft.com/VisualStudio/feedback/details/101293/vsnprintf-not-ansi-c99-compliant |título=Microsoft dá mais ênfase ao C++ |publicado=connect.microsoft.com |língua=inglês |acessodata=23 de maio de 2010}}</ref>
 
=== C11 ===
Em 2007, se iniciou o trabalho em antecipação de outra revisão do padrão de C, informalmente chamada de C11 ou C1X. O comité dos padrões de C adotou regras para limitar a inserção de novos recursos que não tenham ainda sido testados por implementações existentes.<ref>{{Citar web |url=http://www.open-std.org/jtc1/sc22/wg14/ |título=Grupo de trabalho do ISO C |publicado=open-std.org |língua=inglês |acessodata=23 de maio de 2010}}</ref>
 
Em dezembro de 2011 foi publicada a versão estável da especificação, como ISO/IEC 9899:2011.
 
== Visão geral ==
C é uma linguagem imperativa e procedural para implementação de sistemas. Seus pontos de design foram para ele ser compilado, fornecendo acesso irrestrito à [[Memória RAM|memória]] e baixos requerimentos do hardware. Também foi desenvolvido para ser uma linguagem de alto nível, para maior reaproveitamento do código. C foi útil para muitas aplicações que foram codificadas originalmente em [[Linguagem de montagem|Assembly]].
 
Essa propriedade não foi acidental; a linguagem C foi criada com o objectivo principal em mente: facilitar a criação de programas extensos com menos erros recorrendo ao [[paradigma]] da [[programação procedural]] mas sobrecarregando menos o autor do [[compilador]], cujo trabalho complica-se ao ter de realizar as características complexas da linguagem. Para este fim, a linguagem C possui as seguintes características:
 
* Uma linguagem extremamente simples, com funcionalidades não essenciais, tais como funções matemáticas ou manuseamento de ficheiros (arquivos), fornecida por um conjunto de [[Biblioteca (computação)|bibliotecas de rotinas]] padronizada
* A focalização no paradigma de [[programação procedural]]
* Um [[Tipo de dado|sistema de tipos]] simples que evita várias operações que não fazem sentido
* Uso de uma linguagem de [[Pré-processador|pré-processamento]] para tarefas tais como a definição de [[macro]]s e a inclusão de múltiplos ficheiros de [[código fonte]]
* [[Ponteiro (programação)|Ponteiros]] dão maior flexibilidade à linguagem
* Acesso de baixo nível, através de inclusões de código Assembly no meio do programa C
* Parâmetros que são sempre passados por valor para as funções e nunca por referência (É possível simular a passagem por referência com o uso de ponteiros)
* Definição do alcance lexical de variáveis
* Estruturas de variáveis, (structs), que permitem que dados relacionados sejam combinados e manipulados como um todo
 
Algumas características úteis, que faltam em C, podem ser encontradas em outras linguagens, que incluem:
 
* Segurança de tipo
* [[Coletor de lixo (informática)|Coletor de lixo]] (mais comum em [[Linguagem interpretada|linguagens interpretadas]])
* Vetores que crescem automaticamente
* [[Classe (programação)|Classes]] ou [[objeto]]s com comportamento ''(ver [[Orientação a objetos]])''
* [[Clausura (ciência da computação)|Clausuras]]
* [[Composição de funções|Funções aninhadas]]
* Sobrecarga de operadores
* Meta-programação
* Apoio nativo de ''multithreading'' e comunicação por rede
 
Apesar da lista de características úteis que C possui não ser longa, isso não tem sido um impedimento à sua aceitação, pois isso permite que novos compiladores de C sejam escritos rapidamente para novas plataformas, e também permite que o programador permaneça sempre em controle do que o programa está a fazer. Isto é o que por várias vezes permite o código de C correr de uma forma mais eficiente que muitas outras linguagens. Tipicamente, só código de Assembly "afinado à mão" é que corre mais rapidamente, pois possui um controle completo da máquina, mas avanços na área de compiladores juntamente com uma nova complexidade nos processadores modernos permitiram que a diferença tenha sido rapidamente eliminada.
Uma consequência da aceitação geral da linguagem C é que frequentemente os [[compiladores]], [[biblioteca (computação)|bibliotecas]] e até [[interpretador]]es de outras linguagens sejam implementados em C.
 
C tem como ponto forte a sua eficiência, e é a linguagem de programação preferida para o desenvolvimento de sistemas e softwares de base, apesar de também ser usada para desenvolver [[programa de computador|programas de computador]]. É também muito usada no ensino de [[ciência da computação]], mesmo não tendo sido projetada para estudantes e apresentando algumas dificuldades no seu uso. Outra característica importante de C é o seu código resultante em [[Assembly]] ter funcionamento idêntico ao [[código fonte]], que permite que um projetista seja capaz de fazer algumas previsões de como o software irá se comportar ao ser executado.
 
O ponto negativo de C está na possibilidade do programador cometer erros graças a liberdade que a linguagem oferece. Por exemplo é possível acessar área de memória que não pertence a um vetor ao acessar um índice maior que seu tamanho, possibilitando que ocorra um [[buffer overflow]].
Isto acontece em C porque o dever de controlar a memória está nas mãos do programador.
O motivo de C dar total controle para o programador é porque a linguagem foi projetada para programar o [[sistema operacional]] [[UNIX]], onde havia a necessidade desse controle sobre a forma como o sistema iria funcionar. <ref name="unix"></ref>
 
=== Tipos de dados ===
C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem [[ALGOL]], tais como [[Pascal (linguagem de programação)|Pascal]]. Possui tipos para números inteiros de vários tamanhos com e sem sinal, [[Ponto flutuante|números de ponto flutuante]], caracteres e estruturas (<code>struct</code>s).
C usa extensivamente [[Ponteiro (programação)|ponteiros]], um tipo muito simples de referência que guarda o endereço de memória da variável. O ponteiro pode ser ''desreferenciado'', uma operação que busca o objeto que se encontra na morada da memória que o ponteiro possui, morada essa que pode ser manipulada através de aritmética de ponteiros. Durante o [[tempo de execução]], o ponteiro é simplesmente uma morada de máquina tais como aquelas manipuladas em ''Assembly'', mas em [[tempo de compilação]] possui um tipo complexo que indica o tipo do objecto para onde ele aponta, permitindo que se verifique o tipo de expressões, incluindo ponteiros. O tipo "string" (cadeia ou linha de texto) de C é simplesmente um ponteiro para um vetor de caracteres e alocação dinâmica de memória, descrita abaixo, é efetuada através de ponteiros.
 
Os ponteiros em C possuem um valor reservado especial, <code>NULL</code>, que indica que não estão a apontar para uma morada. O uso desse valor como morada é muito útil na construção de várias estruturas de dados, mas causa comportamento não definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um ponteiro que possui o valor <code>NULL</code> é chamado ''ponteiro nulo''. Os ponteiros são declarados (e desreferenciados) com um '''*''' (asterisco), portanto o tipo ''int*'' denota um ponteiro para variável(eis) que comporta(m) número(s) inteiro(s). A linguagem C também fornece um tipo especial de ponteiros, o ''void*'', que se traduz num ponteiro que aponta para um objeto de tipo desconhecido.
 
A linguagem C também tem apoio em nível de linguagem para vetores estáticos (de dimensão fixa) de tipos. As disposições de tipos podem parecer ter mais que uma dimensão apesar de serem tecnicamente disposições de disposições de tipos. Em memória, tais estruturas são posicionadas com as linhas uma depois da outra (a alternativa seria armazenar os dados em colunas, usado em outras linguagens). O acesso a disposições de tipos é feito através de ponteiros e aritmética de ponteiros; o nome da disposição é tratado como se fosse um ponteiro que aponta para o início da disposição. Em certas aplicações não é razoável usarem-se disposições de tipos de dimensão fixa e por isso a alocação dinâmica de memória pode ser usada para criar disposições de tipos de dimensão variável.
 
Como a linguagem C é regularmente usada em programação de baixo-nível de sistemas, há casos em que é necessário tratar um número inteiro como sendo um ponteiro, um número de ponto flutuante como sendo um número inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de "moldagem" (também denominado "conversão de tipo" ou "casting"), uma operação que, caso seja possível, força a conversão de um objeto de um tipo para outro. Apesar de ser por vezes necessário, o uso de conversões de tipo sacrifica alguma segurança oferecida pelo sistema de tipos.
 
; int
O tipo de dado '''int''' (inteiro) serve para armazenar valores numéricos inteiros. Existem vários tipos de inteiros, cada um de um tamanho diferente (dependendo do sistema operacional e/ou arquitetura do processador):
 
* <code>int</code>, pode possuir [[16 bit]]s, [[32 bit]]s ou [[64 bit]]s
* <code>short int</code>, deve possuir tamanho de no mínimo 16 bits e não pode ser maior que <code>int</code>
* <code>long int</code>, deve possuir tamanho mínimo de [[32 bit]]s
* <code>long long int</code>, deve possuir tamanho mínimo de [[64 bit]]s
 
Todos estes tipos de inteiros podem ainda ser declarados precedidos da cláusula ''unsigned'', o que faz com que só suporte números positivos. Isto faz com que, com o mesmo tamanho, uma variável suporte mais números positivos do que um ''signed'' (todos os inteiros são signed por omissão).
 
; char
O tipo '''char''' ocupa 1 [[byte]], e serve para armazenar [[caractere]]s ou [[Número inteiro|inteiros]]. Isso significa que o programa reserva um espaço de 8 bits na [[memória RAM]] ou em [[registrador]]es do processador para armazenar um valor ('''char''' de tamanho maior que 8 bits é permitido pela linguagem, mas os casos são raros). Com vetores do tipo char é possível criar [[Cadeia de caracteres|cadeias de caracteres]] (strings).
 
; float
O tipo de dado '''float''' serve para armazenar números de [[ponto flutuante]], ou seja, com casas decimais. O padrão mais utilizado nos últimos 10 anos é o [[IEEE 754-1985]].
 
; double
O tipo de dado '''double''' serve para armazenar números de ponto flutuante de dupla precisão, normalmente tem o dobro do tamanho do float e portanto o dobro da capacidade. O padrão mais adotado também é o IEEE 754-1985.
 
; struct
Em C podem ser usadas estruturas (chamados de registos em outras linguagens de programação). As estruturas são grupos de variáveis organizadas arbitráriamente pelo programador. Uma estrutura pode criar um novo tipo de variável caso [[typedef]] seja usado em sua declaração.
 
== Relações com C++ ==
A linguagem de programação [[C++]] foi originalmente derivada do C para suportar programação [[Orientação a objetos|orientada a objetos]]. À medida que as linguagens C e C++ foram evoluindo independentemente, a divisão entre as duas veio a aumentar.
O padrão C99 criou um número de características que entram em conflito. Hoje, as principais diferenças entre as duas linguagens são:
 
* '''<code>inline</code>''' - em C++, funções em linha encontram-se no espaço global enquanto que em C encontram-se no espaço local. Por outras palavras, isso significa que, em C++, qualquer definição de qualquer função em linha (sem ser a respeito da sobrecarga de funções de C++) tem de estar em conformidade com a "regra de uma definição" da linguagem C++. Mas em C, a mesma função em linha pode ser definida de maneira diferente em diferentes arquivos (ou ficheiros)
* A palavra-chave '''<code>bool</code>''', igual à usada em C++, em C99 necessita que se inclua o ficheiro-cabeçalho <code><stdbool.h></code> (_Bool está sempre disponível). Padrões anteriores de C não definiam um tipo booleano e vários (e incompatíveis) métodos foram usados para simular um tipo booleano
 
Algumas características originalmente desenvolvidas em C++ também apareceram em C. Entre elas encontram-se:
 
* protótipos de função (com declaração de tipos de parâmetros) e remoção do "int" implícito
* comentários de linha, indicados por <code>//</code>; comentários de linha terminam com um carácter de nova-linha
* a palavra-chave '''<code>inline</code>'''
* tipagem mais forte
 
== Exemplos ==
[[File:The C Programming Language.png|thumb|A linguagem de programação C]]
=== Programa Olá Mundo ===
{{Artigo principal|Programa Olá Mundo}}
A seguinte aplicação foi publicada na primeira edição de C de K&R, e tornou-se no programa de introdução padrão da maior parte dos livros sobre C. O programa envia o texto "[[Programa Olá Mundo|Olá, Mundo!]]" para a [[Fluxos padrão#Saída padrão (stdout)|saída padrão]], que é normalmente o [[Console de comandos|console]], mas que também pode ser um ficheiro (ou arquivo), um outro dispositivo qualquer, ou até mesmo um ''[[bit bucket]]'', dependendo de como a saída-padrão é mapeada na altura em que o programa é executado.
 
<syntaxhighlight lang="C" line>
int main(void)
{
    puts("Olá, Mundo!");
}
</syntaxhighlight>
 
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 alterações no programa original:
 
<syntaxhighlight lang="C" line>
#include <stdio.h> /* Pacotes com funções de entrada e saída */
 
int main(void)
{
{
     printf("Olá, Mundo!\n");
     puts("Olá, Mundo!");
    return 0; /* Retorna 0, pois `main` retorna um `int` */
}
}
</nowiki>
/* Nova linha após fechar a chave principal */
</pre>
</syntaxhighlight>
 
A primeira linha do programa é uma [[Pré-processador|diretiva de pré-processamento]] <code>#include</code>, que causa com que o pré-processador substitua aquela linha pela totalidade do conteúdo do arquivo qual diretiva se refere. Neste caso o arquivo padrão <code>stdio.h</code> (que contém protótipos de funções para trabalho com entrada e saída) irá substituir a linha. Os caracteres <code><</code> e <code>></code> indicam que o arquivo stdio.h encontra-se no local em que, quando da configuração do compilador, se definiu como padrão para localização dos ficheiros de inclusão (''header files'', geralmente com a extensão ''.h'').
 
A linha (não vazia) seguinte indica que uma função denominada ''main'' será definida. A função ''main'' tem um significado especial nos programas em C, pois é a função que é inicialmente executada (em inglês, ''[[entry point]]''). Os caracteres <code>{</code> e <code>}</code> delimitam a extensão da função. O termo <code>int</code> define a função ''main'' como sendo uma função que retorna um número inteiro. O termo <code>void</code> indica que a função não aceita parâmetros. A função ''main'', normalmente aceita parâmetros, que são passado pela [[Interpretador de comandos|linha de comando]]. Os compiladores e sistemas operacionais atuais reconhecem as seguintes declarações de main:
 
<syntaxhighlight lang="c">
int main();
int main(void);
int main(int argc, char *argv[]);
int main(int argc, char **argv);
</syntaxhighlight>
 
A linha seguinte "chama", ou executa uma função chamada <code>puts</code>; o arquivo incluído, <code>stdio.h</code>, contém a informação que descreve a forma como a função <code>puts</code> deve ser chamada. Nesta chamada, é passado à função <code>puts</code> um único argumento, a linha de texto constante "Olá, Mundo!". A função <code>puts</code> retorna um valor, um <code>int</code>, mas como não é usado, é descartado pelo compilador. O comando <code>return</code> retorna o valor 0 para o sistema, que é interpretado pelo mesmo como que a função main() foi executada e encerrada com sucesso (sem erros). Por fim, o caracter <code>}</code> indica o fim da função <code>main</code>. Note-se que texto rodeado por <code>/*</code> e <code>*/</code> (comentários de texto) é ignorado pelo compilador. Os compiladores que obedecem à norma C99 também aceitam como comentários as linhas de texto que são precedidos por <code>//</code>.


Apesar do programa acima correr correctamente, presentemente origina algumas mensagens de aviso quando compilado com C ANSI. Essas mensagens podem ser eliminadas efectuando umas pequenas alterações no programa original:
Pode ser compilado e executado com o seguinte comando (considerando que o [[GNU Compiler Collection|GCC]] está instalado):


<pre>
<syntaxhighlight lang="Console">
<nowiki>
$ gcc hello.c -o hello
$ ./hello
</syntaxhighlight>
 
=== Algoritmo de Trabb Pardo-Knuth ===
{{Artigo principal|Algoritmo de Trabb Pardo-Knuth}}
 
<syntaxhighlight lang="C" line>
#include <math.h>
#include <stdio.h>
#include <stdio.h>
double f(double t)
{
    return sqrt(fabs(t)) + 5 * pow(t, 3);
}


int main(void)
int main(void)
{
{
     printf("Olá, Mundo!\n");
     double a[11] = {0}, y;
     return 0;
    for (int i = 0; i < 11; i++)
        scanf("%lf", &a[i]);
 
    for (int i = 10; i >= 0; i--) {
        y = f(a[i]);
        if (y > 400)
            printf("%d TOO LARGE\n", i);
        else
            printf("%d %.16g\n", i, y);
     }
}
}
</nowiki>
</syntaxhighlight>
</pre>


A primeira linha do programa é uma [[directiva de pré-processamento]] '''#include''', que causa que o compilador substitua aquela linha pela totalidade do conteúdo do ficheiro (ou outra entidade) a que a directiva se refere. Neste caso o ficheiro padrão <code>stdio.h</code> (que contém protótipos de funções para trabalho com entrada e saída padrão) irá substituir a linha. Os caracteres <code> < > </code> <!-- tradução de "angle brackets" ? --> indicam que o ficheiro stdio.h encontra-se no local em que, quando da configuração do compilador, se definiu como padrão para localização dos ficheiros de inclusão (header files, geralmente com a extensão ''.h'').
Pode ser compilado e executado com o seguinte comando:


A linha (não-vazia) seguinte indica que uma função denominada "main" está a ser definida. A função "main" tem um significado especial nos programas de C, pois é a função que é corrida de inicio quando o programa começa <!-- for hosted implementations of C, and leaving aside "housekeeping" code -->. os caracteres <code>{}</code> delimitam a extensão da função. O termo <code>int</code> define a função "main" como sendo uma função que retorna um número inteiro. O termo <code>void</code> indica que a função não aceita parâmetros. <!-- esta frase terá sido bem conseguida? -->
<syntaxhighlight lang="Console">
$ gcc -lm tpk.c -o tpk
$ ./tpk
</syntaxhighlight>


A linha seguinte "chama", ou executa uma função chamada <code>printf</code>; o ficheiro incluido, <code>stdio.h</code>, contém a informação que descreve a forma como a função <code>printf</code> poderá ser chamada. Nesta chamada, é passado à função <code>printf</code> um único argumento, a linha de texto constante "Olá, Mundo!\n"; O \n é traduzido num caracter de "nova linha", que quando se envia para a saída-padrão faz com que o texto seguinte seja escrito na linha imediatamente abaixo. A função <code>printf</code> retorna um valor, um <code>int</code>, mas como não é usado ela é descartada pelo compilador.
<code>-lm</code> instrui o ''linker'' a juntar o módulo de matemática (''libm'').
O depoimento <!-- há tradução melhor?--> <code>return</code> ordena ao programa a saída da função que se encontra correntemente (neste caso a função <code>main</code>), devolvendo o valor zero à função que a invocou. Como a função actual é a função <code>main</code>, a função que a invocou é seja o que for que iniciou o programa. Por fim, o caracter <code>}</code> indica o fim da função <code>main</code>.
Note-se que texto rodeado por <code>/*</code> e <code>*/</code> (comentários de texto) é ignorado pelo compilador. Os compiladores que obedecem à norma C99 também aceitam como comentários as linhas de texto que são precedidos por <code>//</code>.


===Tipos===
=== Estruturas de dados ===
A linguagem C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem [[linguagem de programação Algol|Algol]], tais como [[linguagem de programação Pascal|Pascal]]. Possui tipos para números inteiros de vários tamanhos com e sem sinal, [[números de ponto  flutuante]], caracteres e registos (<code>struct</code>s).
No exemplo seguinte, é criada uma estrutura composta por 3 membros de tipos diferentes. Os membros podem ser acessados com a seguinte sintaxe: <code>estrutura.membro</code>.
C usa extensivamente [[ponteiros]], um tipo muito simples de '''referência''' que guarda a morada dum local na memória. O ponteiro pode ser ''dereferenciado'', uma operação que busca o objecto que se encontra na morada da memória que o ponteiro possui, morada essa que pode ser manipulada através de [[aritmética de ponteiros]]. <!-- atalho que não se encontrava no artigo original mas suponho que merece ser abordado -->. Durante o tempo de execução, o ponteiro é simplesmente uma morada de máquina tais como aquelas manipuladas em ''assembly'', mas em tempo de compilação possui um tipo complexo que indica o tipo do objecto para onde ele aponta, permitindo que se verifique o tipo de expressões, incluindo ponteiros. Os ponteiros são usados extensivamente em C. O tipo linha de texto de C é simplesmente um ponteiro para uma disposição de caracteres <!-- array of characters --> e alocação <!-- será palavra?--> dinâmica de memória, descrita abaixo, é efectuada através de ponteiros.
Os ponteiros em C possuem um valor reservado especial, <code>NULL</code>, que indica que não estão a apontar para uma morada. O uso desse valor como morada é muito útil na construção de várias estruturas de dados, mas causa comportamento não-definido (possivelmente uma falha de sistema) ao ser dereferenciado.<!-- tradução certa? --> Um ponteiro que possui o valor <code>NULL</code> é chamado ''ponteiro nulo''. A linguagem C também fornece um tipo especial de ponteiros, o ''ponteiro vazio'' <!-- Será a tradução certa de "void pointer"? -->, que se traduz num ponteiro que aponta para um objecto de tipo desconhecido.


A linguagem C também tem apoio a nivel de linguagem para disposições estáticas (de dimensão fixa) de tipos. As disposições de tipos podem parecer ter mais que uma dimensão apesar de serem técnicamente disposições de disposições de tipos. <!-- traduzir: Dimensions are laid out in row-major order. --> O acesso a disposições de tipos é feito através de ponteiros e aritmética de ponteiros; o nome da disposição é tratado como se fosse um ponteiro que aponta para o início da disposição. Em certas aplicações não é razoável usar-se disposições de tipos de dimensão fixa e por isso a alocação dinâmica de memória pode ser usada para criar disposições de tipos de dimensão variável. <!-- "dinamically-sized" == "dimensão variável" ?" --> (ver armazenamento de dados em baixo).
<syntaxhighlight lang="C" line>
#include <inttypes.h>
#include <stdio.h>


Como a linguagem C é regularmente usada em programação de baixo-nivel de sistemas, há casos em que é necessário tratar um número inteiro como sendo uma memória, um número de ponto flutuante como sendo um número inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de "moldagem" (também denominado "conversão de tipo"), uma operação que, caso seja possivel, força a conversão de um objecto de um tipo para outro. Apesar de ser por vezes necessário, o uso de conversões de tipo sacrifica alguma segurança oferecida pelo sistema de tipos.
struct Pessoa
===Armazenamento de dados===
{
<!-- a completar -->
    char    nome[32];
==Problemas da linguagem C==
    char    rg[14]; // 13 caracteres + '\0'
Há uma expressão popular que traduz-se em algo do género: "com C é fácil dar-se tiros no pé". Por outras palavras, C permite que se efectuem operações que são geralmente não muito desejáveis, e consequentemente, muitos erros simples feitos pelo programador não são detectados pelo compilador ou até mesmo durante o tempo de execução. Isso dá aso a que os programas apresentem um comportamento imprevisivel.
    uint8_t idade;
Um dos problemas é os objectos alocados automática e dinamicamente não serem inicializados; possuem de inicio qualquer que seja o valor que esteja presente no espaço de memória que ocupam aquando da sua criação. Esse valor é completamente imprevisivel e pode variar entre máquinas, execuções do programa ou até entre duas chamadas à mesma função. Se o programa tenta usar um valor não-inicializado, os resultados obtidos são imprevisiveis. Actualmente, a grande maioria dos compiladores detecta e avisa o programador da existência deste tipo de situações.
};
Os ponteiros da linguagem C são uma principal fonte deste tipo de perigo. Por não serem verificados, um ponteiro pode ser definido para apontar para qualquer objecto de qualquer tipo, incluindo código. Como nada impede o programador de escrever para a morada onde o ponteiro aponta, essa acção pode causar efeitos imprevisiveis. Apesar da maior parte dos ponteiros apontar para locais seguros, o seu alvo também pode ser movido para locais inseguros através do uso de aritmética de ponteiros, a memória para onde apontam pode ter sido dealocada e reutilizada (ponteiros pendurados) ou podem ser desinicializados <!-- é palavra? --> (ponteiros selvagens). Outro problema dos ponteiros é que a linguagem C permite a livre conversão entre tipos de ponteiros; de novo, a grande maioria dos compiladores actuais são capazes de lançar avisos sobre isto. Outras linguagens de programação tentam abordar este problema através da imposição de restrições maiores aos tipos de referência.
Apesar da linguagem C possuir suporte nativo de disposições estáticas de tipos, ela não verifica se as disposições são indexadas por um índice válido (verificação de limites). Por exemplo, é possivel escrever no 6º elemento de uma disposição de 5 tipos, o que tem como efeito resultados imprevisiveis. Isto é chamado de '''buffer overflow'''. <!-- termo português? --> Apesar disto ser fiel à filosofia da linguagem C de dar ao programador controle total, também tem vindo a ser uma fonte de inúmeros problemas de segurança em servidores de redes baseados na linguagem C. <!-- precisa de uma tradução melhor -->
Outro problema comum na linguagem C é não ser possivel a reutilização da memória da pilha <!-- será essa a tradução de "heap" ? --> sem antes ter sido explicitamente libertada pelo programador através da função <code>free()</code>. O resultado disto é que se o programador se esquecer acidentalmente de libertar a memória, mas continuar a alocá-la, cada vez mais memória será consumida desnecessáriamente ao longo do tempo. Esta situação é chamada de [[fuga de memória]]. Também é possivel que aconteça o problema inverso, ou seja, libertar memória cedo demais e continuar a usá-la. Como o sistema de alocação de memória pode reutilizar a memória em qualquer momento por motivos não-relaciondos, isto resulta em comportamento imprevisivel. Estas situações em particular são corrigidas em linguagens de programação que suportem '''colecção automática de lixo'''.
Tem vindo a ser criadas ferramentas com o intuito de ajudar os programadores a evitar muitos destes tipos de erros quando programam em C. <!--snip: Será válido fazer publicidade a um programa num artigo sobre uma linguagem de programação? --> Também existem bibliotecas que efectuam verificação dos limites de disposições de tipos e também uma forma algo limitada de '''colecção de lixo automática''', mas não fazem parte do padrão da linguagem C.
==História==
===Desenvolvimentos iniciais===
O desenvolvimento inicial da linguagem C ocorreu nos [[laboratórios Bell]] da AT&T entre [[1969]] e [[1973]]. Segundo Ritchie, o periodo mais creativo ocorreu em [[1972]]. Deu-se o nome "C" à linguagem porque muitas das suas características derivaram de uma linguagem de programação anterior chamada "[[linguagem de programação B|B]]". Há vários relatos que se referem à origem do nome "B": Ken Thompson dá crédito à [[linguagem de programação BCPL]] mas ele também criou uma outra linguagem de programação chamada '''Bon'', em honra da sua mulher Bonnie.
Por volta de [[1973]], a linguagem C tinha-se tornado suficientemente poderosa para que grande parte do [[núcleo]] de UNIX, originalmente escrito na linguagem de programação PDP-11/20 assembly, fosse reescrito em C. Este foi um dos primeiros núcleos de sistema operativo que foi implementado numa linguagem sem ser o assembly, sendo exemplos anteriores o sistema [[Multics]] (escrito em PL/I) e [[TRIPOS]] (escrito em BCPL).
===C de K&R=== <!-- será o termo correcto? -->
Em [[1978]], Ritchie e [[Brian Kernighan]] publicaram a primeira edição do livro [[The C Programming Language]]. Esse livro, conhecido pelos programadores de C como "K&R", serviu durante muitos anos como uma [[especificação]] informal da linguagem. A versão da linguagem C que ele descreve é usualmente referida como "C de K&R". (A segunda edição do livro cobre o posterior padrão [[ANSI C]], descrito abaixo.)
K&R introduziram as seguintes características na linguagem:
* tipos de dados <code>struct</code>
* tipos de dados <code>long int</code>
* tipos de dados <code>unsigned int</code>
* O operador =+ foi alterado para +=, e assim sucessivamente (o [[analizador léxico]] do compilador confundia o operador =+. Por exemplo, i =+ 10 e i = +10).


C de K&R é frequentemente considerado a parte mais básica da linguagem que é necessário que um compilador de C suporte. Durante muitos anos, mesmo após a introdução do padrão C ANSI, ele era considerado o "menor denominador comum" que programadores de C se apoiavam quando uma portabilidade máxima era desejada, desde que nem todos os compiladores eram actualizados para apoiar na integra o  padrão C ANSI, e código C de K&R razoavelmente bem escrito é também legal em C ANSI.
int main(void)
Nos anos que se seguiram à publicação do C K&R, algumas características "não-oficiais" foram adicionadas à linguagem, suportadas por compiladores da AT&T e de outros vendedores. Estas incluiam:
{
* funções <code>void</code> e tipos de dados <code>void *</code>
    struct Pessoa p1 = {
* funções que retornam tipos <code>struct</code> ou <code>union</code>
        .nome  = "Fulano",
* campos de nome <code>struct</code> num espaço de nome separado para cada tipo <code>struct</code>
        .rg    = "00.000.000-00",
* atribuição a tipos de dados <code>struct</code>
        .idade = 27,
* qualificadores <code>const</code> para criar um objecto só de leitura
    };
* uma biblioteca-padrão que incorpora grande parte da funcionalidade implementada por vários vendedores
 
* [[enumeração|enumerações]]
    printf(" Nome: %s\n", p1.nome);
* o tipo de ponto-flutuante de precisão simples
    printf("  RG: %s\n", p1.rg);
===C ANSI e C ISO===
    printf("Idade: %u\n", p1.idade);
Durante os finais da [[Década de 1970|década de 1970]], a linguagem C começou a substituir a linguagem [[Linguagem de programação BASIC|BASIC]] como a linguagem de programação de [[Microcomputador|microcomputadores]] mais usada. Durante a [[Década de 1980|década de 1980]], foi adoptada para uso no [[PC IBM]], e a sua popularidade começou a aumentar significativamente. Ao mesmo tempo, [[Bjarne Stroustrup]], juntamente com outros nos laboratórios Bell, começou a trabalhar num projecto onde se adicionava construcções de linguagens de programação orientada por objectos à linguagem C. A linguagem que eles produziram, chamada [[Linguagem de programação C mais mais|C++]], é nos dias de hoje a linguagem de programação de aplicações mais comum no sistema operativo [[windows]] da companhia Microsoft; C permanece mais popular no mundo UNIX.
}
Em [[1983]], o instituto norte-americano de padrões ([[ANSI]]) formou um comité, X3j11, para estabelecer uma especificação do padrão da linguagem C. Após um processo longo e árduo, o padrão foi completo em [[1989]] e ratificado como ANSI X3.159-1989 "Programming Language C". Esta versão da linguagem é frequentemente referida como C ANSI. Em [[1990]], o padrão C ANSI, após sofrer umas modificações menores, foi adoptado pela Organização Internacional de Padrões ([[ISO]]) como [[ISO 9899|ISO/IEC 9899:1990]].
</syntaxhighlight>
Um dos objectivos do processo de padronização C ANSI foi o de produzir um [[sobreconjunto]] do C K&R, incorporando muitas das características não-oficiais subsequentemente introduzidas. Entretanto, muitos programas tinham sido escritos e que não compilavam em certas plataformas, ou com um certo compilador, devido a
 
* o uso de bibliotecas não-padrão (por exemplo, interfaces gráficos)
Ou, equivalente:
* alguns compiladores não aderirem ao padrão C ANSI, ou ao seu sucessor, no seu modo por defeito.  
 
<!-- último parágrafo: o texto original diz C ANSI mas não será C ISO? -->
<syntaxhighlight lang="C" highlight="4, 9, 13" line>
#include <inttypes.h>
#include <stdio.h>


===C99===
typedef struct
Após o processo ANSI de padronização, as especificações da linguagem C permaneceram relativamente estáticas por algum tempo, enquanto que a linguagem C++ continuou a evoluir. (em [[1995]], a Normative Amendment 1 criou uma versão nova da linguagem C mas esta versão raramente é tida em conta.) Contudo, o padrão foi submetido a uma revisão nos finais da [[Década de 1990|década de 1990]], levando à publicação da norma ISO 9899:1999 em [[1999]]. Este padrão é geralmente referido como "C99". O padrão foi adoptado como um padrão ANSI em Março de [[2000]].
{
As novas características do C99 incluem:
    char    nome[32];
* [[funções em linha]]
    char    rg[14]; // 13 caracteres + '\0'
* levantamento de restriçõs sobre a localização da declaração de variáveis (como em C++)
    uint8_t idade;
* adição de vários tipos de dados novos, incluindo o <code>long long int</code> (para minimizar a dor da transição de '''32-bits''' para '''64-bits'''), um tipo de dados boolean explicito e um tipo <code>complex</code> que representa [[números complexos]]
} Pessoa;
* disposições de dados de comprimento variável <!-- tradução correcta?-->
* suporte oficial para comentários de uma linha iniciados por <code>//</code>, emprestados da linguagem C++
* várias funções de biblioteca novas, tais como <code>snprintf()</code>
* vários ficheiros-cabeçalho novos, tais como <code>stdint.h</code>


O interesse em suportar as características novas de C99 parece depender muito das entidades. Apesar do [[GNU Compiler Collection|GCC]] e vários outros compiladores suportarem grande parte das novas características do C99, os compiladores mantidos pela Microsoft e pela Borland não, e estas duas companhias não parecem estar muito interessadas adicionar tais funcionalidades, ignorando por completo as normas internacionais.
int main(void)
{
    Pessoa p1 = {
        .nome  = "Fulano",
        .rg    = "00.000.000-00",
        .idade = 27,
    };


==Relações com C++==
    printf(" Nome: %s\n", p1.nome);
A linguagem de programação [[linguagem de programação C mais mais|C++]] foi originalmente derivada do C. À medida que as linguagens C e C++ foram evoluindo independentemente, a divisão entre as duas tem vindo a aumentar.
    printf("  RG: %s\n", p1.rg);
O padrão C99 criou um número de características que entram em conflito. Hoje, as principais diferenças entre as duas linguagens são:
    printf("Idade: %u\n", p1.idade);
* '''<code>inline</code>''' - em C++, funções em linha encontram-se no espaço global enquanto que em C encontram-se no espaço do ficheiro. Por outras palavras, isso significa que em C++, qualquer definição de qualquer função em linha (mas sem ser a respeito da sobrecarga de funções de C++) tem de estar em conformidade com a "regra de uma definição" da linguagem C++. <!-- completar depois--> Mas em C, a mesma função em linha pode ser definida de maneira diferente em diferentes <!-- unidades de tradução (ou --> ficheiros.
}
* A palavra-chave '''<code>bool</code>''' em C99 encontra-se no seu próprio ficheiro-cabeçalho, <code><stdbool.h></code>. Padrões anteriores de C não definiam um tipo booleano, e vários (e incompatíveis) métodos foram usados para simular um tipo booleano.
</syntaxhighlight>
Algumas características originalmente desenvolvidas em C++ também apareceram em C. Entre elas encontram-se:
 
* prototipagem
É possível omitir os nomes dos membros durante a inicialização:
* comentários de linha, indicados por <code>//</code>; comentários de linha terminam com um caracter de nova-linha
 
* a palavra-chave '''<code>inline</code>'''
<syntaxhighlight lang="C" start="13" line>
* a palavra-chave '''<code>void</code>'''
Pessoa p1 = { "Fulano", "00.000.000-00", 27 };
* tipagem mais forte <!-- tradução correcta? -->
</syntaxhighlight>
 
== Ferramentas de programação ==
* [[Dev-C++|Bloodshed Dev-C++]]
* [[Ambiente de desenvolvimento integrado|IDE (Ambiente de desenvolvimento integrado)]], como [[Code::Blocks]], [[NetBeans]] e [[JetBrains CLion]]
* [[GNU Compiler Collection]]
* [[Automação de compilação]], como [[make]]
 
== Ver também ==
* [[C++]]
* [[Go (linguagem de programação)]]
* [[Objective-C]]
* [[Pascal (linguagem de programação)]]
 
{{Referências}}
 
== Ligações externas ==
{{Correlatos
|commonscat =C (programming language)
|wikilivros  =Categoria:Livro/Programar em C
}}
*{{Oficial|https://www.iso.org/standard/74528.html|en}}
*{{Link|idioma=en|url=http://www.open-std.org/jtc1/sc22/wg14/|título=Grupo ISO WG14|descr=manutenção da linguagem C}}
* {{Link|2=http://user.das.ufsc.br/~jomi/das5334/Livro%20Aberto%20Aprendendo%20a%20Programar%20naLinguagem%20C.pdf|3=Aprendendo a programar na Linguagem C, por Universidade Federal de Alagoas}}
* {{dmoz|Computers/Programming/Languages/C/}}


==Ferramentas de programação==
*[[GNU Compiler Collection]]
*[[Make]]


[[bg:C (език за програмиране)]]
{{Linguagens de programação}}
[[ca:Llenguatge C]]
{{Lista de Normas da Comissão Eletrotécnica Internacional}}
[[cs:Jazyk C]]
{{Controle de autoridade}}
[[de:C (Programmiersprache)]]
[[en:C programming language]]
[[eo:C Komputillingvo]]
[[es:Lenguaje de programación C]]
[[et:C (programmeerimiskeel)]]
[[fi:C-ohjelmointikieli]]
[[fr:C (langage)]]
[[hu:C programozási nyelv]]
[[is:Forritunarmálið C]]
[[it:C (linguaggio)]]
[[ja:C言語]]
[[nl:Programmeertaal C]]
[[no:C (programmeringsspråk)]]
[[pl:C (język programowania)]]
[[sv:C (programspråk)]]
[[th:ภาษาซี]]
[[tr:C programlama dili]]
[[zh-cn:C编程语言]]
[[zh-tw:C编程语言]]


[[Categoria:Linguagem de programação]]
[[Categoria:C (linguagem de programação)| ]]
[[Categoria:Linguagens de programação procedurais]]

Edição atual tal como às 19h15min de 20 de agosto de 2022

Disambig grey.svg Nota: Para outros significados, veja C (desambiguação).

Predefinição:Info/Linguagem de computador C[1] é uma linguagem de programação compilada de propósito geral, estruturada, imperativa, procedural, padronizada pela Organização Internacional para Padronização (ISO), criada em 1972 por Dennis Ritchie na empresa AT&T Bell Labs para desenvolvimento do sistema operacional Unix (originalmente escrito em Assembly).[2]

C é uma das linguagens de programação mais populares[3][4] e existem poucas arquiteturas para as quais não existem compiladores para C. C tem influenciado muitas outras linguagens de programação (por exemplo, a linguagem Java),[5] mais notavelmente C++, que originalmente começou como uma extensão para C.

A linguagem C encontra-se na versão/padrão internacional C17 (ISO/IEC 9899:2018) lançada em junho de 2018, substituindo a versão C11 (ISO/IEC 9899:2011),[6] disponível em ISO e IEC e com suporte para GCC8 e Clang LLVM6.[7]

História

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.[8] de acordo com Ritchie, o período mais criativo ocorreu em 1972. A linguagem foi chamada "C", porque suas características foram obtidas a partir de uma linguagem anteriormente chamada de "B", que de acordo com Ken Thompson era a versão reduzida da linguagem de programação BCPL.[9]

A versão original PDP-11 do sistema Unix foi desenvolvido em assembly. Em 1973, com a adição 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 núcleos de sistemas operacionais implementados numa linguagem diferente da linguagem Assembly. Em 1977, foram feitas novas mudanças por Ritchie e Stephen C. Johnson para facilitar a portabilidade do sistema operacional Unix. O Portable C Compiler de Johnson serviu de base para várias implementações de C em novas plataformas.[10]

C K&R

A linguagem C não teve um sucesso imediato após a sua criação e o seu uso ficou restrito a alguns laboratórios,[11] mas em 1978 Brian Kernighan e Dennis Ritchie lançam o livro The C Programming Language.[12] que serviu de tutorial e mudou a história da programação em C. De fato essa primeira versão da linguagem é conhecida como "C Kernigham e Ritchie" ou apenas "C K&R".[13]

Esse livro, conhecido pelos programadores de C como "K&R", serviu durante muitos anos como uma especificação informal da linguagem. A versão da linguagem C que ele descreve é usualmente referida como "K&R C". A segunda edição do livro cobriu o padrão posterior, o ANSI C. K&R C introduziu as seguintes características na linguagem:

  • Biblioteca padrão de E/S
  • Tipo de dados struct
  • Tipo de dados long int
  • Tipo de dados unsigned int
  • O operador =+ foi alterado para +=, e =- para -= (o analisador léxico do compilador fazia confusão entre i =+ 10 e i = +10. O mesmo acontecia com =-)

K&R C é frequentemente considerado a parte mais básica da linguagem, cujo suporte deve ser assegurado por um compilador de C. Durante muitos anos, mesmo após a introdução do padrão ANSI C, K&R C foi considerado o "menor denominador comum", em que programadores de C se apoiavam quando uma portabilidade máxima era desejada, já que nem todos os compiladores eram actualizados o suficiente para suportar o padrão ANSI C.

Nos anos que se seguiram à publicação do K&R C, algumas características "não oficiais" foram adicionadas à linguagem, suportadas por compiladores da AT&T e de outros vendedores. Estas incluíam:

  • Funções void e tipos de dados void *
  • Funções que retornam tipos struct ou union
  • Campos de nome struct num espaço de nome separado para cada tipo struct
  • Atribuição a tipos de dados struct
  • Qualificadores const para criar um objecto só de leitura
  • Biblioteca padrão, que incorpora grande parte da funcionalidade implementada por vários vendedores
  • Enumerações
  • Cálculos de ponto-flutuante em precisão simples (no K&R C, os cálculos intermediários eram feitos sempre em double, porque era mais eficiente na máquina onde a primeira implementação do C foi feita)

ANSI C e ISO C

Durante os finais da década de 1970, a linguagem C começou a substituir a linguagem BASIC como a linguagem de programação de microcomputadores mais usada. Durante a década de 1980, foi adaptada para uso no PC IBM, e a sua popularidade começou a aumentar significativamente. Ao mesmo tempo, Bjarne Stroustrup, juntamente com outros nos laboratórios Bell, começou a trabalhar num projecto onde se adicionavam extras para programação orientada por objectos à linguagem C. A linguagem que eles produziram, chamada C++, é nos dias de hoje a linguagem de programação de aplicações mais comum no sistema operativo Windows da companhia Microsoft. A linguagem C permanece a mais popular no mundo Unix.

Em 1983, o instituto norte-americano de padrões (ANSI) formou um comité, X3J11, para estabelecer uma especificação do padrão da linguagem C. Após um processo longo e árduo, o padrão foi completo em 1989 e ratificado como ANSI X3.159-1989 "Programming Language C". Esta versão da linguagem é frequentemente referida como ANSI C. Em 1990, o padrão ANSI C, após sofrer umas modificações menores, foi adotado pela Organização Internacional para Padronização (ISO) que cria o grupo de trabalho para cuidar da especificação da linguagem, denominado WG14, assim foi renomeada para ISO/IEC 9899:1990, também conhecido como C89 e C90.[14] Um dos objetivos do processo de padronização ANSI C foi o de produzir um sobreconjunto do K&R C, incorporando muitas das características não oficiais subsequentemente introduzidas. Entretanto, muitos programas tinham sido escritos e que não compilavam em certas plataformas, ou com um certo compilador, devido ao uso de bibliotecas de funções não padrão e ao fato de alguns compiladores não aderirem ao ANSI C.

C99

Após o processo da padronização ANSI, as especificações da linguagem C permaneceram relativamente estáticas por algum tempo, enquanto a linguagem C++ continuou a evoluir. (em 1995, a Normative Amendment 1 criou uma versão nova da linguagem C mas esta versão raramente é tida em conta.) Contudo, o padrão foi submetido a uma revisão nos finais da década de 1990, levando à publicação da norma ISO 9899:1999 em 1999. Este padrão é geralmente referido como "C99" e foi adoptado como um padrão ANSI em março de 2000. As novas características do C99 incluem:

  • Funções em linha
  • Remoção de restrições sobre a localização da declaração de variáveis (como em C++)
  • Adição de vários tipos de dados novos, incluindo o long long int (para minimizar problemas na transição de 32-bits para 64-bits), um tipo de dados boolean explicito (chamado _Bool) e um tipo complex que representa números complexos
  • Vetores de dados de comprimento variável (o vetor pode ter um tamanho diferente a cada execução de uma função, mas não cresce depois de criado)
  • Suporte oficial para comentários de uma linha iniciados por //, emprestados da linguagem C++
  • Várias funções de biblioteca novas, tais como snprintf()
  • Vários ficheiros-cabeçalho novos, tais como stdint.h

O interesse em suportar as características novas de C99 parece depender muito das entidades. Apesar do GCC e vários outros compiladores suportarem grande parte das novas características do C99, os compiladores mantidos pela Microsoft e pela Borland suportam pouquíssimos recursos do C99, e estas duas companhias não parecem estar muito interessadas em adicionar tais funcionalidades, ignorando por completo as normas internacionais. A Microsoft parece preferir dar mais ênfase ao C++.[15]

C11

Em 2007, se iniciou o trabalho em antecipação de outra revisão do padrão de C, informalmente chamada de C11 ou C1X. O comité dos padrões de C adotou regras para limitar a inserção de novos recursos que não tenham ainda sido testados por implementações existentes.[16]

Em dezembro de 2011 foi publicada a versão estável da especificação, como ISO/IEC 9899:2011.

Visão geral

C é uma linguagem imperativa e procedural para implementação de sistemas. Seus pontos de design foram para ele ser compilado, fornecendo acesso irrestrito à memória e baixos requerimentos do hardware. Também foi desenvolvido para ser uma linguagem de alto nível, para maior reaproveitamento do código. C foi útil para muitas aplicações que foram codificadas originalmente em Assembly.

Essa propriedade não foi acidental; a linguagem C foi criada com o objectivo principal em mente: facilitar a criação de programas extensos com menos erros recorrendo ao paradigma da programação procedural mas sobrecarregando menos o autor do compilador, cujo trabalho complica-se ao ter de realizar as características complexas da linguagem. Para este fim, a linguagem C possui as seguintes características:

  • Uma linguagem extremamente simples, com funcionalidades não essenciais, tais como funções matemáticas ou manuseamento de ficheiros (arquivos), fornecida por um conjunto de bibliotecas de rotinas padronizada
  • A focalização no paradigma de programação procedural
  • Um sistema de tipos simples que evita várias operações que não fazem sentido
  • Uso de uma linguagem de pré-processamento para tarefas tais como a definição de macros e a inclusão de múltiplos ficheiros de código fonte
  • Ponteiros dão maior flexibilidade à linguagem
  • Acesso de baixo nível, através de inclusões de código Assembly no meio do programa C
  • Parâmetros que são sempre passados por valor para as funções e nunca por referência (É possível simular a passagem por referência com o uso de ponteiros)
  • Definição do alcance lexical de variáveis
  • Estruturas de variáveis, (structs), que permitem que dados relacionados sejam combinados e manipulados como um todo

Algumas características úteis, que faltam em C, podem ser encontradas em outras linguagens, que incluem:

Apesar da lista de características úteis que C possui não ser longa, isso não tem sido um impedimento à sua aceitação, pois isso permite que novos compiladores de C sejam escritos rapidamente para novas plataformas, e também permite que o programador permaneça sempre em controle do que o programa está a fazer. Isto é o que por várias vezes permite o código de C correr de uma forma mais eficiente que muitas outras linguagens. Tipicamente, só código de Assembly "afinado à mão" é que corre mais rapidamente, pois possui um controle completo da máquina, mas avanços na área de compiladores juntamente com uma nova complexidade nos processadores modernos permitiram que a diferença tenha sido rapidamente eliminada. Uma consequência da aceitação geral da linguagem C é que frequentemente os compiladores, bibliotecas e até interpretadores de outras linguagens sejam implementados em C.

C tem como ponto forte a sua eficiência, e é a linguagem de programação preferida para o desenvolvimento de sistemas e softwares de base, apesar de também ser usada para desenvolver programas de computador. É também muito usada no ensino de ciência da computação, mesmo não tendo sido projetada para estudantes e apresentando algumas dificuldades no seu uso. Outra característica importante de C é o seu código resultante em Assembly ter funcionamento idêntico ao código fonte, que permite que um projetista seja capaz de fazer algumas previsões de como o software irá se comportar ao ser executado.

O ponto negativo de C está na possibilidade do programador cometer erros graças a liberdade que a linguagem oferece. Por exemplo é possível acessar área de memória que não pertence a um vetor ao acessar um índice maior que seu tamanho, possibilitando que ocorra um buffer overflow. Isto acontece em C porque o dever de controlar a memória está nas mãos do programador. O motivo de C dar total controle para o programador é porque a linguagem foi projetada para programar o sistema operacional UNIX, onde havia a necessidade desse controle sobre a forma como o sistema iria funcionar. [2]

Tipos de dados

C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem ALGOL, tais como Pascal. Possui tipos para números inteiros de vários tamanhos com e sem sinal, números de ponto flutuante, caracteres e estruturas (structs). C usa extensivamente ponteiros, um tipo muito simples de referência que guarda o endereço de memória da variável. O ponteiro pode ser desreferenciado, uma operação que busca o objeto que se encontra na morada da memória que o ponteiro possui, morada essa que pode ser manipulada através de aritmética de ponteiros. Durante o tempo de execução, o ponteiro é simplesmente uma morada de máquina tais como aquelas manipuladas em Assembly, mas em tempo de compilação possui um tipo complexo que indica o tipo do objecto para onde ele aponta, permitindo que se verifique o tipo de expressões, incluindo ponteiros. O tipo "string" (cadeia ou linha de texto) de C é simplesmente um ponteiro para um vetor de caracteres e alocação dinâmica de memória, descrita abaixo, é efetuada através de ponteiros.

Os ponteiros em C possuem um valor reservado especial, NULL, que indica que não estão a apontar para uma morada. O uso desse valor como morada é muito útil na construção de várias estruturas de dados, mas causa comportamento não definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um ponteiro que possui o valor NULL é chamado ponteiro nulo. Os ponteiros são declarados (e desreferenciados) com um * (asterisco), portanto o tipo int* denota um ponteiro para variável(eis) que comporta(m) número(s) inteiro(s). A linguagem C também fornece um tipo especial de ponteiros, o void*, que se traduz num ponteiro que aponta para um objeto de tipo desconhecido.

A linguagem C também tem apoio em nível de linguagem para vetores estáticos (de dimensão fixa) de tipos. As disposições de tipos podem parecer ter mais que uma dimensão apesar de serem tecnicamente disposições de disposições de tipos. Em memória, tais estruturas são posicionadas com as linhas uma depois da outra (a alternativa seria armazenar os dados em colunas, usado em outras linguagens). O acesso a disposições de tipos é feito através de ponteiros e aritmética de ponteiros; o nome da disposição é tratado como se fosse um ponteiro que aponta para o início da disposição. Em certas aplicações não é razoável usarem-se disposições de tipos de dimensão fixa e por isso a alocação dinâmica de memória pode ser usada para criar disposições de tipos de dimensão variável.

Como a linguagem C é regularmente usada em programação de baixo-nível de sistemas, há casos em que é necessário tratar um número inteiro como sendo um ponteiro, um número de ponto flutuante como sendo um número inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de "moldagem" (também denominado "conversão de tipo" ou "casting"), uma operação que, caso seja possível, força a conversão de um objeto de um tipo para outro. Apesar de ser por vezes necessário, o uso de conversões de tipo sacrifica alguma segurança oferecida pelo sistema de tipos.

int

O tipo de dado int (inteiro) serve para armazenar valores numéricos inteiros. Existem vários 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 mínimo 16 bits e não pode ser maior que int
  • long int, deve possuir tamanho mínimo de 32 bits
  • long long int, deve possuir tamanho mínimo de 64 bits

Todos estes tipos de inteiros podem ainda ser declarados precedidos da cláusula unsigned, o que faz com que só suporte números positivos. Isto faz com que, com o mesmo tamanho, uma variável suporte mais números positivos do que um signed (todos os inteiros são signed por omissão).

char

O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso significa que o programa reserva um espaço de 8 bits na memória RAM ou em registradores do processador para armazenar um valor (char de tamanho maior que 8 bits é permitido pela linguagem, mas os casos são raros). Com vetores do tipo char é possível criar cadeias de caracteres (strings).

float

O tipo de dado float serve para armazenar números de ponto flutuante, ou seja, com casas decimais. O padrão mais utilizado nos últimos 10 anos é o IEEE 754-1985.

double

O tipo de dado double serve para armazenar números de ponto flutuante de dupla precisão, normalmente tem o dobro do tamanho do float e portanto o dobro da capacidade. O padrão mais adotado também é o IEEE 754-1985.

struct

Em C podem ser usadas estruturas (chamados de registos em outras linguagens de programação). As estruturas são grupos de variáveis organizadas arbitráriamente pelo programador. Uma estrutura pode criar um novo tipo de variável caso typedef seja usado em sua declaração.

Relações com C++

A linguagem de programação C++ foi originalmente derivada do C para suportar programação orientada a objetos. À medida que as linguagens C e C++ foram evoluindo independentemente, a divisão entre as duas veio a aumentar. O padrão C99 criou um número de características que entram em conflito. Hoje, as principais diferenças entre as duas linguagens são:

  • inline - em C++, funções em linha encontram-se no espaço global enquanto que em C encontram-se no espaço local. Por outras palavras, isso significa que, em C++, qualquer definição de qualquer função em linha (sem ser a respeito da sobrecarga de funções de C++) tem de estar em conformidade com a "regra de uma definição" da linguagem C++. Mas em C, a mesma função 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-cabeçalho <stdbool.h> (_Bool está sempre disponível). Padrões anteriores de C não definiam um tipo booleano e vários (e incompatíveis) métodos foram usados para simular um tipo booleano

Algumas características originalmente desenvolvidas em C++ também apareceram em C. Entre elas encontram-se:

  • protótipos de função (com declaração de tipos de parâmetros) e remoção do "int" implícito
  • comentários de linha, indicados por //; comentários de linha terminam com um carácter de nova-linha
  • a palavra-chave inline
  • tipagem mais forte

Exemplos

A linguagem de programação C

Programa Olá Mundo

Ver artigo principal: Programa Olá Mundo

A seguinte aplicação foi publicada na primeira edição de C de K&R, e tornou-se no programa de introdução padrão da maior parte dos livros sobre C. O programa envia o texto "Olá, Mundo!" para a saída padrão, que é normalmente o console, mas que também pode ser um ficheiro (ou arquivo), um outro dispositivo qualquer, ou até mesmo um bit bucket, dependendo de como a saída-padrão é 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 alterações no programa original:

#include <stdio.h> /* Pacotes com funções de entrada e saída */

int main(void)
{
    puts("Olá, Mundo!");
    return 0; /* Retorna 0, pois `main` retorna um `int` */
}
/* Nova linha após 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 conteúdo do arquivo qual diretiva se refere. Neste caso o arquivo padrão stdio.h (que contém protótipos de funções para trabalho com entrada e saída) irá substituir a linha. Os caracteres < e > indicam que o arquivo stdio.h encontra-se no local em que, quando da configuração do compilador, se definiu como padrão para localização dos ficheiros de inclusão (header files, geralmente com a extensão .h).

A linha (não vazia) seguinte indica que uma função denominada main será definida. A função main tem um significado especial nos programas em C, pois é a função que é inicialmente executada (em inglês, entry point). Os caracteres { e } delimitam a extensão da função. O termo int define a função main como sendo uma função que retorna um número inteiro. O termo void indica que a função não aceita parâmetros. A função main, normalmente aceita parâmetros, que são passado pela linha de comando. Os compiladores e sistemas operacionais atuais reconhecem as seguintes declarações de main:

int main();
int main(void);
int main(int argc, char *argv[]);
int main(int argc, char **argv);

A linha seguinte "chama", ou executa uma função chamada puts; o arquivo incluído, stdio.h, contém a informação que descreve a forma como a função puts deve ser chamada. Nesta chamada, é passado à função puts um único argumento, a linha de texto constante "Olá, Mundo!". A função puts retorna um valor, um int, mas como não é usado, é descartado pelo compilador. O comando return retorna o valor 0 para o sistema, que é interpretado pelo mesmo como que a função main() foi executada e encerrada com sucesso (sem erros). Por fim, o caracter } indica o fim da função main. Note-se que texto rodeado por /* e */ (comentários de texto) é ignorado pelo compilador. Os compiladores que obedecem à norma C99 também aceitam como comentários as linhas de texto que são precedidos por //.

Pode ser compilado e executado com o seguinte comando (considerando que o GCC está instalado):

$ gcc hello.c -o hello
$ ./hello

Algoritmo de Trabb Pardo-Knuth

Ver artigo principal: Algoritmo de Trabb Pardo-Knuth
#include <math.h>
#include <stdio.h>

double f(double t)
{
    return sqrt(fabs(t)) + 5 * pow(t, 3);
}

int main(void)
{
    double a[11] = {0}, y;
    for (int i = 0; i < 11; i++)
        scanf("%lf", &a[i]);

    for (int i = 10; i >= 0; i--) {
        y = f(a[i]);
        if (y > 400)
            printf("%d TOO LARGE\n", i);
        else
            printf("%d %.16g\n", i, y);
    }
}

Pode ser compilado e executado com o seguinte comando:

$ gcc -lm tpk.c -o tpk
$ ./tpk

-lm instrui o linker a juntar o módulo de matemática (libm).

Estruturas de dados

No exemplo seguinte, é criada uma estrutura composta por 3 membros de tipos diferentes. Os membros podem ser acessados com a seguinte sintaxe: estrutura.membro.

#include <inttypes.h>
#include <stdio.h>

struct Pessoa
{
    char    nome[32];
    char    rg[14]; // 13 caracteres + '\0'
    uint8_t idade;
};

int main(void)
{
    struct Pessoa p1 = {
        .nome  = "Fulano",
        .rg    = "00.000.000-00",
        .idade = 27,
    };

    printf(" Nome: %s\n", p1.nome);
    printf("   RG: %s\n", p1.rg);
    printf("Idade: %u\n", p1.idade);
}

Ou, equivalente:

#include <inttypes.h>
#include <stdio.h>

typedef struct
{
    char    nome[32];
    char    rg[14]; // 13 caracteres + '\0'
    uint8_t idade;
} Pessoa;

int main(void)
{
    Pessoa p1 = {
        .nome  = "Fulano",
        .rg    = "00.000.000-00",
        .idade = 27,
    };

    printf(" Nome: %s\n", p1.nome);
    printf("   RG: %s\n", p1.rg);
    printf("Idade: %u\n", p1.idade);
}

É possível omitir os nomes dos membros durante a inicialização:

Pessoa p1 = { "Fulano", "00.000.000-00", 27 };

Ferramentas de programação

Ver também

Referências

  1. «ISO/IEC 9899:2018». ISO (em English). Consultado em 8 de novembro de 2018 
  2. 2,0 2,1 «History of the C Programming Language» (em inglês). livinginternet.com. Consultado em 23 de maio de 2010 
  3. «Programming Language Popularity» (em inglês). langpop.com. Consultado em 23 de maio de 2010 
  4. «TIOBE Programming Community Index» (em inglês). tiobe.com. Consultado em 23 de maio de 2010 
  5. «C – The Influence Factor of Many Popular Programming Languages» (em inglês). cprogramminglanguage.com. Consultado em 23 de maio de 2010 
  6. «The Standard - C». ISO (em English). Consultado em 8 de novembro de 2018 
  7. «Initial C17 Language Support Lands In LLVM Clang 6.0 SVN - Phoronix». Phoronix (em English). Consultado em 8 de novembro de 2018 
  8. Ritchie, Dennis M. (janeiro de 1993). «The Development of the C Language». Consultado em 1 de janeiro de 2008. The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. 
  9. A Brief History of C
  10. Johnson, S. C.; Ritchie, D. M. (1978). «Portability of C Programs and the UNIX System» (PDF). Bell System Tech. J. 57 (6): 2021–2048. Consultado em 16 de dezembro de 2012 
  11. «Entrevista com Dennis Ritchie, Bjarne Stroustrup e James Gosling» (em (em inglês)). Java Report e C++ Report. Julho de 2000. Consultado em 3 de junho de 2015 
  12. Kernighan, Brian W.; Ritchie, Dennis M (1978). The C Programming Language (em inglês). Upper Saddle River, New Jersey: Prentice hall. 228 páginas. ISBN 0-13-110163-3 
  13. Rosangle Hickson. Aprenda a programa em C, C++ e C# 2a ed. [S.l.]: Campus. p. 3. ISBN 978-85-352-1479-6 
  14. «Especificações da linguagem C». Mente Binária (em português). Consultado em 8 de novembro de 2018 
  15. «Microsoft dá mais ênfase ao C++» (em inglês). connect.microsoft.com. Consultado em 23 de maio de 2010 
  16. «Grupo de trabalho do ISO C» (em inglês). open-std.org. Consultado em 23 de maio de 2010 

Ligações externas

Outros projetos Wikimedia também contêm material sobre este tema:
Wikilivros Livros e manuais no Wikilivros
Commons Categoria no Commons


Predefinição:Lista de Normas da Comissão Eletrotécnica Internacional

talvez você goste