A maior rede de estudos do Brasil

Grátis
347 pág.
LINGUAGEM C

Pré-visualização | Página 46 de 50

modificando o valor da variável x para 1605, como mostrado abaixo: 
 
 
 
0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 
 
 
 
Um dos usos mais comuns de uma união é unir um tipo básico a um array de tipos 
menores. Tome como exemplo a seguinte declaração de união: 
 
union tipo 
{ 
 short int x; 
 unsigned char c[2]; 
}; 
Saída: 
X = 1545 
C = 9 
X = 1605 
C = 69 
unsigned char c = 9 
short int x = 1545 
unsigned char c = 69 
short int x = 1605 
206 
 
 
 
 
Sabemos que a variável x ocupa 2 bytes na memória. Como cada posição da variável c 
ocupa apenas 1 byte, podemos acessar facilmente cada uma das partes da variável x, sem precisar 
recorrer a operações de manipulação de bits (operações lógicas e de deslocamento de bits). 
Observe: 
 
 
 
0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 
 
 
 
 
 
3. ENUMERAÇÕES – ENUM 
Uma enumeração pode ser vista como uma lista de constantes, onde cada constante 
possui um nome significativo. A ideia básica por trás da enumeração é criar apenas um tipo de 
dado que contenha várias constante, sendo que uma variável desse tipo só poderá receber como 
valor uma dessas constantes. 
A sintaxe básica para a declaração de uma enumeração em C é a seguinte: 
 
 
enum nome_da_enum {lista_de_identificadores}; 
 
 
Onde: 
 enum  palavra reservada da linguagem que define uma enumeração; 
 nome_da_enum  identificador da enumeração; 
 lista_de_identificadores  lista de palavras separadas por vírgula e delimitadas 
pelo operador de chaves que constituem as constantes definidas pela enumeração. 
 
Observe abaixo o exemplo de um comando que cria uma enumeração de nome semana, 
onde seus valores constantes são os nomes dos dias da semana. 
c[0] = 9 
x = 1545 
c[1] = 6 
207 
 
 
 
 
enum semana {Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado}; 
 
As estruturas podem ser declaradas em qualquer escopo do programa (global ou local). 
Apesar disso, a maioria das enumerações são declaradas no escopo global. Por se tratar de um 
novo tipo de dado, muitas vezes é interessante que todo o programa tenha acesso a enumaração. 
Daí a necessidade de usar o escopo global. Depois do símbolo de fecha chaves ({}) da 
enumeração é necessário colocar um ponto e vírgula (;), uma vez que a enumeração pode ser 
também declarada no escopo local. 
Por questões de simplificações, e por se tratar de um novo tipo, é possível logo na 
definição da enumeração definir algumas variáveis desse tipo. Para isso, basta colocar os nomes 
das variáveis declaradas após o comando de fecha chaves da enumeração e antes do ponto e 
vírgula. Observe: 
 
enum semana {Domingo,Segunda,Terca,Quarta,Quinta,Sexta,Sabado} s1, s2; 
 
No exemplo acima, duas variáveis (s1 e s2) são declaradas junto com a definição da 
enumeração. 
 
 
3.1. DECLARAÇÃO DE VARIÁVEL DO TIPO ENUMERAÇÃO 
Uma vez definida a enumeração, uma variável pode ser declarada de modo similar aos 
tipos já existente. Observe: 
 
enum semana s; 
 
A variável pode ser inicializada como qualquer outra variável, usando, para isso, uma das 
constantes da enumeração. Observe: 
 
s = Segunda; 
 
Por ser um tipo definido pelo programador, usa-se a palavra enum antes do tipo da nova 
variável declarada. 
 
 
208 
 
 
 
3.2. ENUMERAÇÕES E CONSTANTES 
Para o programador, uma enumeração pode ser vista como uma lista de constantes, onde 
cada constante possui um nome significativo. Porém, para o compilador, cada uma das constantes 
é representada por um valor inteiro, sendo que o valor da primeira constante da enumeração é 0 
(zero). Desse modo, uma enumeração pode ser usada em qualquer expressão válida com inteiros, 
como mostrado no exemplo abaixo. 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. enum semana {Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado}; 
4. int main() 
5. { 
6. enum semana s1, s2, s3; 
7. s1 = Segunda; 
8. s2 = Terca; 
9. s3 = s1 + s2; 
10. printf("Domingo = %d\n", Domingo); 
11. printf("S1 = %d\n", s1); 
12. printf("S2 = %d\n", s2); 
13. printf("S3 = %d\n", s3); 
14. return 0; 
15. } 
 
No exemplo acima, a constante Domingo, Segunda e Terca, possuem, respectivamente, 
os valores 0 (zero), 1 (um) e 2 (dois). Como o compilador trata cada uma das constantes 
internamente como um valor inteiro, é possível somar as enumerações, ainda que isso não faça 
muito sentido. 
Na definição da enumeração, pode-se também atribuir valores da tabela ASCII para as 
constantes. Observe: 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. enum semana {Domingo=1, Segunda, Terca, Quarta=7, Quinta, Sexta, Sabado}; 
4. int main() 
5. { 
6. printf("Domingo = %d\n", Domingo); 
7. printf("Segunda = %d\n", Segunda); 
8. printf("Terca = %d\n", Terca); 
9. printf("Quarta = %d\n", Quarta); 
10. printf("Quinta = %d\n", Quinta); 
11. printf("Sexta = %d\n", Sexta); 
12. printf("Sabado = %d\n", Sabado); 
13. return 0; 
14. } 
 
 
Saída: 
Domingo = 0 
S1 = 1 
S2 = 2 
S3 = 3 
 
Saída: 
Domingo = 1 
Segunda = 2 
Terca = 3 
Quarta = 7 
Quinta = 8 
Sexta = 9 
Sabado = 10 
209 
 
 
 
No exemplo acima, a constante Domingo foi inicializada com o valor 1. As constantes da 
enumeração que não possuem valor definido são definidas automaticamente como o valor do 
elemento anterior acrescidos de um. Assim, Segunda é inicializada com 2 e Terca com 3. Para a 
constante Quarta foi definido o valor 7. Assim, as constantes definidas na sequência após a 
constante Quarta possuirão os valores 8, 9 e 10, respectivamente. 
Na definição da enumeração, pode-se também atribuir valores da tabela ASCII para as 
constantes. Observe: 
 
 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. enum escapes {retrocesso=’\b’, tabulação=’\t’, novalinha=’\n’}; 
4. int main() 
5. { 
6. enum escapes e; 
7. e = novalinha; 
8. printf("Teste %c de %c escrita\n", e, e); 
9. e = tabulacao; 
10. printf("Teste %c de %c escrita\n", e, e); 
11. return 0; 
12. } 
 
 
 
4. TYPEDEF 
A linguagem C permite que o programador defina os seus próprios tipos baseados em 
outros tipos de dados existentes. Para isso, utiliza-se o comando typedef, cuja sintaxe básica é a 
seguinte: 
 
 
typedef tipo_existente novo_nome; 
 
 
Onde: 
 typedef  palavra reservada da linguagem que define um novo tipo; 
 tipo_existente  tipo primitivo ou definido pelo programador; 
 novo_nome  identificador para o novo tipo que se está definindo. 
Saída: 
Teste 
de 
escrita 
Teste de escrita 
210 
 
 
 
 
Vale ressaltar que o comando typedef não cria um novo tipo. Ele apenas permite que o 
programador defina um sinônimo para um tipo já existente. Observe o exemplo abaixo: 
 
typedef int inteiro; 
 
O comando typedef não cria um novo tipo chamado inteiro. Ele apenas cria um sinônimo 
(inteiro) para o tipo int. Esse novo nome torna-se equivalente ao tipo já existente. No 
comando typedef, o sinônimo e o tipo existente são equivalentes. Observe: 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. typedef int inteiro; 
4. int main() 
5. { 
6. int x = 10; 
7. inteiro y = 20; 
8. y = y + x; 
9. printf("Soma = %d\n", y); 
10. return 0; 
11. } 
 
No exemplo acima, as variáveis do tipo int e inteiro são usadas de maneira conjunta. 
Isso ocorre pois elas são, na verdade, do mesmo tipo (int). O comando typedef apenas diz ao 
compilador para reconhecer inteiro como um outro nome para o tipo int. 
O comando typedef pode ser usado para simplificar a declaração de um tipo definido 
pelo programador (struct, union, etc) ou