347 pág.

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