Revista Do Linux
EDIÇÃO DO MÊS
 Programação
 Estudo de Caso
 Corporativo

 Entrevista
 Capa
 CD do mês
 Debian
 Echelon
 Gimp
 IPChains
 Monopolio
 Wine

 

Curso de Linguagem C
Nesta segunda parte do curso, iniciado na edição anterior da revista, são apresentados novos conceitos igualmente fundamentais para trabalhar com essa linguagem

Os tipos de dados mais utilizados em C, com algumas peculiaridades em sua manipulação, além dos conceitos de operadores e expressões, importantes para a geração de programas, são o foco deste artigo.

Comentários

Em qualquer linguagem de programação, é sempre importante a documentação das operações realizadas, para que outras pessoas, além do programador, possam entender os procedimentos codificados.

Uma das formas de se documentar um programa em linguagem C é através da inserção de comentários. Isto é feito digitando-se a seqüência /* para indicar o início do comentário, e encerrando com os caracteres */ para indicar o fim. Tudo o que for digitado entre essas duas indicações será ignorado pelo compilador.

Exemplos de comentários:


/* Este programa soma dois números */
/* O comentário pode se estender por várias linhas. O compilador só continuará a processar o programa quando encontrar a sequência de fim: */

Tipos de dados

Como a maioria das linguagens de programação, C define alguns tipos de dados padrão, para caracterizar valores. Esses tipos são usados como constantes ou variáveis no decorrer da execução de um programa.

Enquanto os valores constantes são geralmente colocados em um programa de forma direta (por exemplo, 5, 3.14, texto), os valores variáveis são representados por nomes atribuídos pelo programador. Para que o compilador possa identificar as variáveis, elas devem ser declaradas, ou seja, seus nomes devem ser especificados. Na linguagem C, a declaração também serve para especificar o tipo da variável. Por exemplo:


int numero;
float valor;
char letra;

São declaradas acima três variáveis, uma do tipo inteira, uma do tipo real e uma do tipo caractere. Repare que, por ser uma linguagem de origem americana, os nomes das variáveis não podem ter acentos ou cedilhas. Vejamos as diferenças entre os tipos.

O tipo mais freqüente é o número inteiro (int), ou seja, sem parte decimal, ou "casas depois da vírgula". Esse tipo de dado é um dos mais utilizados, seja para contagem de elementos, seja para controle de repetição de um comando.

Os números com parte fracionária (float) são também chamados de números reais, ou de números com ponto flutuante. Deve-se esse nome ao fato de ser possível a representação do número como uma multiplicação de uma base (chamada de mantissa) por uma potência de dez. Assim, os números 35.978 e 3.5978*10 denotam o mesmo valor, com diferença apenas em sua representação escrita. Repare que o ponto "flutua" de posição, vindo daí o nome "ponto flutuante". Vale lembrar que a origem da palavra também é americana (floating point) e por isso a parte fracionária de um número é separada de sua parte inteira por um ponto e não uma vírgula, como fazemos no Brasil.

Outro tipo bastante utilizado são os caracteres (char). Uma variável assim declarada pode armazenar qualquer um dos caracteres da tabela padrão ASCII, incluindo aqueles não imprimíveis, como o avanço de linha (line-feed, ou LF) ou o retorno de carro (carriage return, ou CR). Pode-se dizer que, na verdade, o tipo char é uma variação do tipo int, com a diferença que ele armazena o código ASCII de um caractere (65 para o caractere ‘A’, 66 para o caractere ‘B’ e assim por diante).

Operadores e expressões

A manipulação dos conteúdos das variáveis é realizada através de operadores. Um exemplo simples são as operações aritméticas. Em C, os operadores são denotados da forma usual: soma (+), subtração (-), multiplicação (*), divisão (/). A atribuição de um valor para uma variável é denotada pelo símbolo de igual (=).

Expressões são combinações de variáveis com operadores, que geram novos valores. Apresentamos alguns exemplos de expressões:


b = 3;
c = 5;
a = b + c;
a = b * c;

Repare que expressões num programa em C, quando indicam um comando, devem também ser terminadas com um ponto-e-vírgula.

A atribuição de um caractere para uma variável do tipo char pode ser feita de duas formas: escrevendo o caractere entre apóstrofes (‘) ou o seu código ASCII. Assim, as duas expressões a seguir são equivalentes:


c = ‘A’;
c = 65; /* codigo ASCII do caractere A */

Expressões com caracteres

É importante lembrar que tipos de dados são, na verdade, abstrações que utilizamos para facilitar a programação. O formato interno dos dados, para o microprocessador, é sempre o mesmo. Ou seja, simplificadamente, tudo são números.

Essa observação foi feita para se apresentar um aspecto interessante da linguagem C, que é a forma de manipulação dos dados. Expressões simples, como a soma de dois números inteiros, são fáceis de se entender, como no exemplo anterior. Mas operações como a mostrada a seguir, embora estranhas à primeira vista, também são válidas:


char letra1;
char letra2;
letra1 = ‘A’;
letra2 = letra1 + 1; /* o valor de letra2 é ‘B’ */

Como já foi dito, uma variável do tipo char armazena o código de um caractere. Assim, se o código ASCII do caractere A é 65 e o do caractere B é 66, o compilador entende "somar" 1 por encontrar o próximo caractere na tabela. Repare que esse resultado só ocorre se a tabela utilizada tiver os códigos na mesma seqüência que as letras. Outras tabelas, como a EBCDIC, utilizada em sistemas IBM de grande porte, não seguem esse padrão.

Operadores relacionais

Os operadores relacionais são utilizados para se realizar a comparação entre dois valores. Os operadores utilizados em C também são denotados, em sua maioria, da forma usual:


> - maior que
< - menor que
>= - maior ou igual a
<= - menor ou igual a

Os operadores para igualdade e desigualdade são um pouco diferentes do normal:

== - igual a (repare que são dois sinais de igual)
!= - diferente de

O operador de igualdade tem a forma mostrada (dois sinais "=") para diferenciá-lo do operador de atribuição.

Os operadores relacionais são utilizados em expressões lógicas. Na linguagem C, uma expressão lógica também gera um valor, como em uma expressão aritmética. A diferença é que, como são possíveis apenas dois resultados (verdadeiro ou falso), o valor de uma expressão lógica pode ser somente 0, para verdadeiro, ou 1, para falso. A seguir, apresentamos exemplos de expressões lógicas e seus valores:


5 > 4 - valor = 0 (verdadeiro)
4 >= 4 - valor = 0 (verdadeiro)
5 == 9 - valor = 1 (falso)
3 != 5 - valor = 1 (falso)

Expressões lógicas podem ser combinadas através dos seguintes operadores:

&& - "E"; a expressão é verdadeira somente se todas as partes forem verdadeiras.

|| - "ou"; a expressão é verdadeira se pelo menos uma das partes for verdadeira.

Vejamos mais alguns exemplos:


5 > 4 && 3 > 2 - valor = 0 (verdadeiro)
5 > 4 && 2 > 7 - valor = 1 (falso), pois embora cinco seja maior que quatro, dois não é maior que sete.
5 > 4 || 2 > 7 - valor = 0 (verdadeiro), pois ao menos uma das expressões é verdadeira (cinco é maior que quatro).
5 > 7 || 2 > 7 - valor = 1 (falso), pois nenhuma das expressões é verdadeira.

Ordem e precedência

Nas expressões da linguagem C, tanto aritméticas quanto lógicas, pode ocorrer a combinação de várias expressões para geração de um valor final. Nessa situação, é importante verificar a ordem das expressões, ou seja, como o compilador irá entender a expressão. Por exemplo, a expressão aritmética:


4 + 3 * 2

Significa que desejamos somar quatro e três e depois multiplicar o resultado por dois, ou que desejamos multiplicar três por dois e somar quatro ao resultado? Como já aprendemos em nosso curso primário de matemática, o uso de parênteses resolve essa dúvida:


(4 + 3) * 2 = 14
4 + (3 * 2) = 10

Na linguagem C, além do uso de parênteses, o compilador se vale de algumas regras pré-definidas para determinar qual operador "manda" mais. Assim, na expressão mostrada, o compilador assume que a multiplicação deve ser realizada antes da soma. A esse tipo de procedimento damos o nome de precedência. No caso da linguagem C, operadores como multiplicação e divisão têm precedência sobre a soma e subtração.

Conclusão

Embora sejam bastante teóricos, esses conceitos são necessários para que possamos criar programas que utilizem todo o potencial da linguagem.

Na próxima parte, apresentaremos os comandos de controle de fluxo para podermos criar um programa C mais complexo. Até lá!

 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux