Linguagem C – Conceitos Básicos
Este texto foi adaptado pelos professores
Alexandre Rômolo Moreira Feitosa e
Francisco Pereira Junior (Thesko).
1. Introdução
A linguagem C assim como várias outras, se posiciona como uma linguagem de finalidade geral, ou
seja, a mesma se presta ao desenvolvimento de programas para quaisquer áreas, inclusive científica.
Desenvolvida nos laboratórios Bell na década de 70, a partir da Linguagem B (criada no final dos
anos 60 por Ken Thompson), que foi reformulada por Brian Kernighan e Dennis M. Ritchie e posteriormente
renomeada para C. Em 1980 a linguagem foi padronizada pelo American National Standard Institute (ANSI),
dando origem ao ANSI C. Logo em seguida, 1982, a linguagem C torna-se ponto de concordância entre
teóricos do desenvolvimento da teoria de Object Oriented Programming (programação orientada a objetos),
originando a Linguagem C++.
A Linguagem C pode ser considerada como uma linguagem de médio nível, pois possui instruções
que a tornam ora uma linguagem de alto nível e estruturada como o Pascal, se assim se fizer necessário,
ora uma linguagem de baixo nível, pois possui instruções tão próximas da máquina, que só o Assembler
possui igual.
De fato com a linguagem C podemos construir programas organizados e concisos (como o Pascal),
ocupando pouco espaço de memória com alta velocidade de execução (como o Assembler). Infelizmente,
dada toda a flexibilidade da linguagem, também poderemos escrever programas desorganizados e difíceis
de serem compreendidos (como usualmente são os programas em BASIC). Tudo depende da dedicação do
programador.
Devemos lembrar que a linguagem C foi desenvolvida a partir da necessidade de se escrever
programas que utilizassem recursos próprios da linguagem de máquina de uma forma mais simples e
portável que o Assembler. Assim, há inúmeras razões para a escolha da linguagem C como a predileta para
os desenvolvedores “profissionais”. As características da linguagem C servirão para mostrar o porquê de
sua ampla utilização.
1.1. Características Básicas
C é uma linguagem estruturada que apresenta como unidade básica a função, ou seja, toda a
computação se dá através de funções, as quais provêem mecanismos para acessar o hardware bem como
estruturas de alto nível tais como laços de repetição, execução condicional, etc.
Diferentemente de outras linguagens como PASCAL, C é sensível ao caso, ou seja, há diferenças
entre letras maiúsculas e minúsculas, o que significa que os identificadores TESTE, Teste, TESTe, TeStE,
etc, são diferentes; desta forma se você está habituado como PASCAL, BASIC ou outras linguagens não
sensíveis ao caso esteja atento a este detalhe.
auto double int struct
break else long switch
case entry register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 1
A linguagem C apresenta um conjunto relativamente reduzido de comandos, e todos eles são
escritos em minúsculo. Alguns compiladores adicionam mais palavras reservadas a este conjunto, porém
estas são geralmente especificadas para o compilador e/ou plataforma alvo o que diminui a portabilidade
dos programas (por exemplo vários compiladores para DOS/Windows incluem as palavras reservas
interrupt, pascal, near, far, etc., as quais não fazem parte do padrão).
Uma das razões de C possuir poucas palavras reservadas (comandos) é a não implementação de
comandos de E/S – entrada e saída – tais como leitura do teclado, manipulação de arquivos ou saída para
vídeo; ao contrário, os projetistas de C optaram por implementar um conjunto de funções (escritas em C
e/ou Assembly) para realizar tais operações (o qual ajuda muito na portabilidade). Este conjunto de funções
é conhecido como Biblioteca C Padrão e pode ser encontrado em todos os compiladores C geralmente na
forma de bibliotecas (arquivos .lib ou .dll). Então, para que um programa C possa realizar operações de E/S
torna-se necessário incluir tal biblioteca.
Outra característica do C é que a medida que a complexidade de um programa aumenta –
impulsionada pelo aumento do tamanho e funcionalidade – a mesma não apenas encoraja, mas prove
mecanismos para a separação de programas em várias partes, ou seja, um programa que reside em um
único arquivo grande pode ser separado em vários arquivos menores facilitando a sua manutenção.
1.1.1. Outras Características da Linguagem C
• Portabilidade entre máquinas e sistemas operacionais (recompilando o código).
• Dados compostos em forma estruturada.
• Programas estruturados.
• Total interação com o sistema operacional.
• Código compacto e rápido, quando comparado ao código de outras linguagem de
complexidade análoga.
1.2. Estrutura de um programa em C
Um programa em C é constituído de:
• Um cabeçalho contendo as diretivas de compilador onde se definem o valor de constantes
simbólicas, declaração de variáveis globais, inclusão de bibliotecas, declaração de rotinas, etc.
• Um bloco de instruções principal e outros blocos de rotinas específicacas.
• Documentação do programa: comentários.
1.2.1. Conjunto de caracteres
Um programa fonte em C é um texto não formatado escrito em um editor de textos usando um o
conjunto padrão de caracteres ASCII. A seguir estão os caracteres utilizados em C:
Caracteres válidos:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
1 2 3 4 5 6 7 8 9 0
+ - * / \ = | & ! ? # % ( ) { } [ ] _ ‘ “ . , : < >
Caracteres não válidos:
@ $ ¨ á é õ ç
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 2
Os caracteres citados anteriormente são válidos apenas dentro de strings.
1.2.2. Comentários
Em C, comentários podem ser escritos em qualquer lugar do texto para facilitar a interpretação do
algoritmo. Para que o comentário seja identificado como tal, ele deve ter um // para comentários em uma
única linha, ou /* antes e um */ depois, para comentários de múltiplas linhas.
Exemplo 1:
// este e´ um comentário para uma única linha.
Exemplo 2:
/* este e´ um comentário que
pode ocupar várias linhas. */
1.2.3. Diretivas de Compilação
Em C, existem comandos que são processados durante a compilação do programa. Estes
comandos são genericamente chamados de diretivas de compilação. Estes comandos informam ao
compilador C basicamente quais são as constantes simbólicas usadas no programa e quais bibliotecas
devem ser anexadas ao programa executável. A diretiva #include diz ao compilador para incluir alguns
arquivos na compilação do programa. Geralmente estes arquivos contem bibliotecas de funções ou rotinas
do usuário. A diretiva #define diz ao compilador quais são as constantes simbólicas usadas no programa.
1.2.4. Declaração de variáveis
Em C, como na maioria das linguagens, as variáveis devem ser declaradas no início do
programa. Estas variáveis podem ser de vários tipos: char (caracter), int (inteiro), float (real de simples
precisão), double (real com precisão dupla). Veremos mais detalhes sobre variáveis no próximo capítulo.
1.2.5. Entrada e saída de dados
Em C existem várias maneiras de fazer a leitura e escrita de informações. Estas operações são
chamadas de operações de entrada e saída. Nas seções posteriores veremos algumas dessas funções,
como: printf, que é uma função de escrita na tela, e scanf, que é uma função de leitura de teclado.
2. Constantes e Variáveis
Neste capítulo veremos como os dados constantes e variáveis são manipuladas pela linguagem C.
O que são constantes inteiras, reais, caracteres e strings. Quais são as regras de atribuição de nomes a
variáveis e quais são os tipos de dados que a linguagem C pode manipular. Veremos também como são
declaradas as variáveis e as constantes simbólicas usadas em um programa.
2.1. Constantes
O C possui quatro tipos básicos de constantes: inteiras, de ponto flutuante, caracteres e strings.
Constantes inteiras e de ponto flutuante representam números de um modo geral. Caracteres e strings
representam letras e agrupamentos de letras (palavras e/ou frases).
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 3
2.1.1. Constantes inteiras
Uma constante inteira é um número de valor inteiro. De uma forma geral, constantes inteiras são
sequências de dígitos que representam números inteiros. Números inteiros podem ser escritos no formato
decimal (base 10), hexadecimal (base 16) ou octal (base 8).
Uma constante inteira decimal é formada por uma sequência de dígitos decimais:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Se a constante tiver dois ou mais dígitos, o primeiro não pode ser 0. Na verdade, pode ser 0,
todavia estará representando um número em outra base numérica (neste caso octal).
Exemplo: A seguir são mostradas algumas constantes Q decimais válidas.
0 3 -45 26338 -7575 1010
Exemplo: Algumas constantes inteiras decimais inválidas.
1. (ponto)
1,2 (vírgula)
045 (primeiro dígito é 0: não é constante decimal)
212-22-33 (caracter ilegal: -)
Uma constante inteira hexadecimal é formada por uma sequência com os dígitos:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (ou a, b, c, d, e).
Uma constante hexadecimal deve começar por 0x. Neste caso, as letras usadas nos dígitos
hexadecimais podem ser minúsculas ou maiúsculas.
Exemplo: A seguir são mostradas algumas constantes inteiras hexadecimais válidas.
0x0 0x3 0x4f5a 0x2FFE OxABCD 0xAaFf
Exemplo: Algumas constantes inteiras hexadecimais inválidas.
0x3. (ponto)
0x1,e (vírgula)
0x ff (espaço)
FFEE (não começa com 0x: não é constante hexadecimal)
0Xfg34 (caracter ilegal: g)
Uma constante inteira octal é formada por uma sequência de dígitos octais:
0, 1, 2, 3, 4, 5, 6, 7.
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 4
A constante octal deve ter o primeiro dígito 0 para que o compilador a identifique como tal.
Exemplo: A seguir são mostradas algumas constantes octais válidas.
00 -03 045 02633 07575 -0101
Exemplo: Algumas constantes inteiras octais inválidas.
010. (ponto)
01,2 (vírgula)
0 4 (espaço)
45 (primeiro digito não é 0: não é constante octal)
01784 (caracter ilegal: 8)
2.1.2. Constantes de ponto flutuante
Números reais (não inteiros) são representados em base 10, por números com um ponto decimal e
(opcionalmente) um expoente. Um número ponto flutuante deve ter um ponto decimal que não pode ser
substituído por uma vírgula. Um número de ponto flutuante pode ser escrito em notação científica. Neste
caso o x10 é substituído por e ou E. O número 1.23e4 representa 1.23 x 104 ou 12300.
Exemplo: Números de ponto flutuante válidos.
0.234 125.65 .93 1.23e-9 -1.e2 10.6e18 -.853E+67
A forma de representação de um número real em C é bastante flexível.
Exemplo: O número 314 pode ser representado por qualquer uma das seguintes formas:
314. 3.14e2 +3.14e+2 31.4e1 .314E+3 314e0
2.1.3. Constantes caracteres
Uma constante caracter é uma letra ou símbolo colocado entre aspas simples.
Exemplo: Abaixo estão representadas algumas constantes caracteres.
’a’ ’b’ ’X’ ’&’ ’{’ ’ ’
Embora sejam visualizados como letras e símbolos, as constantes caracteres são armazenadas
internamente pelo computador como um número inteiro entre 0 e 255. O caracter ’A’ por exemplo, tem
valor 65. Os valores numéricos dos caracteres estão padronizados em uma tabela chamada de American
Standard Code for Information Interchange Table ou simplesmente tabela ASCII. Veja Apêndice A.
Certos códigos de controle da tabela ASCII (como o line feed) ou caracteres especiais (como ')
possuem representação especial na linguagem C. Esta representação chama-se sequência de escape,
representada por uma barra invertida (\) e um caracter. Sequências de escape são interpretadas como
caracteres simples. Segue uma lista das principais sequências de escape usadas no C.
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 5
Controle/Caracter Sequência de escape Valor ASCII
nulo (null) \0 00
campainha (bell) \a 07
retrocesso (backspace) \b 08
tabulação horizontal \t 09 nova
linha (new line) \n 10 tabulação
vertical \v 11 alimentação de
folha (form feed) \f 12 retorno de carro
(carriage return) \r 13 aspas (")
\" 34 apóstrofo (') \'
39 interrogação (?) \? 63
barra invertida (\) \\ 92
2.1.4. Constantes strings
Uma constante string consiste de um conjunto de caracteres colocados entre aspas duplas.
Embora as instruções do C usem apenas os caracteres do conjunto padrão ASCII, as constantes caracter e
string podem conter caracteres do conjunto estendido ASCII, por exemplo: é, ã, ç, ü, ...
Exemplo: Abaixo seguem algumas constantes strings válidas.
”Oba!”
”Caxias do Sul”
”A resposta é: ”
”João Carlos da Silveira”
”a”
”isto é uma string”
Aqui ---- leitura, breve explicación, fazer resumo com tópicos importantes.-------------------------------------------
02/03.
2.2. Identificadores
Identificadores são os nomes das variáveis e funções usadas no programa.
2.2.1. Regras de sintaxe
Os identificadores devem seguir as seguintes regras de construção:
• Os identificadores devem começar por uma letra (a - z, A - Z) ou um underscore ( _ ).
• No restante do identificador pode conter letras, underscores ou dígitos (0 - 9). Não pode
conter outros caracteres. Em C, os identificadores podem ter até 32 caracteres.
• Em C, letras maiúsculas são diferentes de letras minúsculas: Por exemplo: MAX, max, Max
são nomes diferentes para o compilador. Esta propriedade é chamada de case sensibility
(ou case sensitive).
Exemplo: os nomes abaixo são válidos:
abc, y24, VetorPontosMovimentoRobo, nota_1, TAM_MAX.
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 6
Exemplo: os nomes abaixo não são válidos:
3dia, vetor-1, pao&leite, iteração.
Para facilitar a identificação do conteúdo que as variáveis irão armazenar, recomenda-se a utilização de
nomes sugestivos para essas variáveis. Apesar de não ser uma regra, é uma excelente prática de
programação. Usar letras minúsculas para os identificadores de variáveis também é uma prática comum aos
programadores e quando o nome for composto, usam-se as primeiras letras de cada palavra em maiúsculo
(exceto a inicial).
Exemplo: nomes de identificadores convencionados:
idade, nomeDoUsuario, precoProduto, valorUnit, valorTotal
2.2.2. Palavras reservadas
Existem certos nomes que não podem ser usados como identificadores. São chamadas as palavras
reservadas e são de uso restrito da linguagem C (comandos, estruturas, declarações, etc.). O conjunto de
palavras reservadas usadas em C é o seguinte:
asm auto break case cdecl char
class const continue _cs default delete
do double _ds else enum _es
extern _export far _fastcall float for
friend goto huge if inline int
interrupt _loadds long near new operator
pascal private protected public register return
_saveregs _seg short signed sizeof _ss
static struct switch template this typedef
union unsigned virtual void volatile while
Exemplo: Não é possível declarar estes conjuntos de variáveis:
do, re, mi, fa, sol, la, si
old, new
Dos conjuntos acima, do e new são palavras reservadas. Se você utilizar o bom senso e seguir a
dica de usar nomes sugestivos para as variáveis, não precisará decorar esta lista de palavras reservadas,
pois dificilmente coincidirá com alguns desses nomes específicos.
2.3. Tipos de dados
Em C, como na maioria das linguagens, os dados são divididos em tipos: inteiro, real, caracter, etc.
Esta divisão se deve basicamente ao número de bytes reservados para armazenar cada dado, e cada tipo
de dado possui um intervalo de valores permitidos.
2.3.1. Tipos básicos (ou primitivos)
Abaixo segue uma lista dos tipos básicos de dados permitidos em C. Os tipos char e int são
inteiros e os tipos float e double são de ponto flutuante.
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 7
Tipo Tamanho Intervalo Uso
char 1 byte -128 a 127 número muito pequeno e caracter
ASCII
int 2 bytes -32768 a 32767 contador, controle de laço
float 4 bytes 3.4e-38 a 3.4e38 real (precisão de 7 dígitos)
double 8 bytes 1.7e-308 a 1.7e308 científico (precisão de 15 dígitos)
void 0 bytes 0 sem valor
2.3.2. Declaração de variáveis
Para que se possa usar uma variável em um programa, é necessário fazer uma declaração de
variável antes. A declaração de variáveis simplesmente informa ao processador quais são os nomes
utilizados para armazenar dados variáveis e quais são os tipos usados. Deste modo o processador pode
alocar (reservar) o espaço necessário na memória para a manipulação destas variáveis. É possível declarar
mais de uma variável na mesma linha, basta separá-las por vírgulas (,).
Sintaxe: A sintaxe para declaração de variáveis é a seguinte:
tipo variavel_1 [, variavel_2, ...] ;
onde tipo é o tipo de dado e variavel_1 é o nome da variável a ser declarada. Se houver mais de uma
variável, seus nomes são separados por vírgula.
Exemplo: Declaração das variáveis:
int i; int x, y, z; char
letra; float nota_1,
nota_2, media; double num;
No exemplo acima, i, x, y e z foram declaradas variáveis inteiras. Assim elas podem armazenar
valores inteiros de -32768 até 32767. Do mesmo modo letra foi declarada como variável caracter podendo
receber valores de -128 até 127 ou caracteres do conjunto padrão ASCII. As variáveis nota_1, nota_2 e
media foram declaradas como ponto flutuante tipo float e num como ponto flutuante tipo double.
A declaração de variáveis é feita, em geral, dentro de uma rotina. Por exemplo, a rotina principal
main(). Deste modo se diz que está se fazendo uma declaração de variáveis locais. Variáveis locais
podem ser referenciadas apenas dentro da rotina dentro da qual foi declarada, neste caso a rotina main().
Exemplo: Observe o uso da declaração de variáveis no trecho de programa abaixo:
void main(){
float raio, area; // declaração de variáveis
raio = 2.5;
area = 3.14 * raio * raio;
}
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 8
No exemplo acima, as variáveis area e raio foram declaradas como variáveis locais tipo float.
Assim o processador faz a alocação de dois espaços (endereços) de 4 bytes cada para armazenar as
informações, um para cada variável. Na terceira linha, o processador coloca no endereço alocado para raio
o valor 2.5. Depois, na quarta linha, o processador coloca o resultado da conta (19.625) no endereço
chamado area.
É possível fazer a declaração de variáveis fora de uma rotina. Neste caso diz-se que se fez a
declaração de variáveis globais. Variáveis globais podem ser referenciadas de qualquer parte do seu código,
de qualquer rotina.
2.3.3. Inicialização de variáveis.
Quando se faz a declaração de uma variável está se determinando que tipo de dado ela vai
receber. É possível, em C, declarar uma variável e já armazenar nela um valor inicial. Chamamos este
procedimento de inicialização de uma variável.
Sintaxe: A sintaxe para a inicialização de variáveis é:
tipo var_1 = valor_1 [, var_2 = valor_2, ...] ;
onde tipo é o tipo de dado, var_1 é o nome da variável a ser inicializada e valor_1 é o valor inicial da
variável.
Exemplo: Inicialização de variáveis:
int i = 0, j = 100; float
num = 13.5;
char* titulo = "Programa Teste";
No exemplo acima, i e j foram declaradas variáveis tipo int. O valor inicial de i é 0 e o de j é
100. Do mesmo modo num foi declarada como variável float com valor inicial de 13.5. Também a variável
titulo foi declarada como um conjunto caracter e recebeu como conteúdo inicial a string "Programa
Teste". Muito embora não seja obrigatório a inicialização de uma variável, é uma excelente prática de
programação já inicializar as variáveis assim que forem declaradas. Isso evita perder várias ocasiões de
erros por se manipular variáveis contendo “lixo de memória” – um valor qualquer, não designado pelo
usuário.
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0 9
2.4. Operador de Atribuição
A operação de atribuição é a operação mais simples do C. Consiste em atribuir o valor de uma
expressão a uma variável.
Sintaxe: A sintaxe da operação de atribuição é a seguinte:
identificador = expressão;
onde identificador é o nome de uma variável e expressão é uma expressão válida (ou outro
identificador, ou uma constante).
Exemplo: A seguir são mostradas algumas atribuições válidas:
a = 1;
delta = b * b - 4. * a * c;
i = j;
Observe que o símbolo de atribuição ( = ) não tem o mesmo significado que o usual da
matemática que representa a igualdade de valores. Este símbolo, em C, representa a atribuição do valor
calculado em expressão a variável identificador. Em pseudo-linguagem o operador de atribuição é
representado como ←. Também não se pode confundir o operador de atribuição ( = ) com o operador
relacional de igualdade ( == ) que será visto na seção 3.5.1.
Observe-se também que o operando esquerdo deve ser um identificador de variável, isto é, não
pode ser uma constante ou expressão.
Exemplo: A seguir são mostradas algumas atribuições inválidas:
1 = a; // constante!
b + 1 = a; // expressão!
2.4.1. Limites do intervalo do tipo de dado.
Também é importante observar que os tipos em C tem intervalos bem definidos e os resultados das
operações devem respeitar estes intervalos. Se a uma variável for atribuído um valor que esteja fora dos
seus limites então este valor será alterado.
Exemplo: Observe as expressões abaixo, assuma que i seja uma variável do tipo int.
i = 4999; // o valor de i e’ 4999
i = 4999 + 1; // o valor de i e’ 5000 i =
5000 + 30000; // o valor de i e’ -30536
O valor de 35000 ultrapassou o limite superior do tipo int (32767).
É importante observar que em C, ao contrário de outras linguagens, a ultrapassagem do limite de
um tipo não é interpretado como erro. Todavia, isto pode acarretar resultados inesperados para o
programador desatento.
10
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0
2.4.2. Atribuição múltipla.
E possível atribuir um valor a muitas variáveis em uma única instrução. A esta operação dá-se o
nome de atribuição múltipla.
Sintaxe: A sintaxe da atribuição múltipla é a seguinte:
var_1 = [var_2 = ... ] expressão;
onde var_1, var_2, ... são os identificadores de variáveis e expressão é uma expressão válida.
Observe que na atribuição múltipla as operações ocorrem da direita para a esquerda, isto é,
inicialmente o valor de expressão é atribuído a var_2 e depois o valor de var_2 é atribuído a var_1.
Deve-se tomar cuidado com as conversões de tipo e limites de intervalo para atribuições de tipos
diferentes.
Exemplo: Observe a instrução de atribuição múltipla abaixo: as variáveis inteiras i, j e k são
todas inicializadas com o valor 1. E as variáveis de dupla precisão max e min são inicializadas com o
valor 0.0:
int i, j, k;
double max, min; i
= j = k = 1;
max = min = 0.0;
11
Universidade Tecnológica Federal do Paraná | Engenharia de Software | Laboratório de Informática | prof. Thesko | 2014/02 | versão-1.0
12