[CAPÍTULO 1] - [CAPÍTULO 2] - [CAPÍTULO 3]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6] - [PARTE 7] - [PARTE 8]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6] - [PARTE 7] - [PARTE 8]
Declarações: Tipo de Acesso, Inicialização e Constantes
Objetivo:
Nas últimas aulas, estudamos a forma geral de uma DECLARAÇÃO de VARIÁVEIS ( global ou local ):ESPEC-DECLARAÇÃO DECLARADOR-1 = INICIALIZADOR-1, ..., DECLARADOR-n = INCIALIZADOR-n;Recapitulando,
- o
ESPEC-DECLARAÇÃO
é uma seqüência composta de:
- OBRIGATORIAMENTE, um ESPECIFICADOR de TIPO de DADO ( acompanhado ou não de MODIFICADORES )
char
signed
eunsigned
int
signed
eunsigned
long
eshort
float
,double
elong double
- OPCIONALMENTE, um ESPECIFICADOR da CLASSE de MEMÓRIA
auto
register
static
extern
- cada
DECLARADOR-i
(em sua forma mais simples) consiste em um IDENTIFICADOR - cada
= INICIALIZADOR-i
é OPCIONAL e (em sua forma mais simples) consiste em uma CONSTANTE
Na aula de HOJE, nosso objetivo é tornar este quadro mais completo apresentando um terceiro e último tipo de ESPECIFICADOR que pode ser utilizado em declarações:
- ESPECIFICADOR de TIPO de ACESSO
-
const
evolatile
-
ESPECIFICADOR de TIPO de ACESSO:
Em uma declaração de variáveis (globais ou locais), um ESPECIFICADOR de TIPO de ACESSO pode ser utilizado para estabelecer a maneira como as variáveis podem ser acessadas ou modificadas. Em C, há duas PALAVRAS RESERVADAS que funcionam como ESPECIFICADORES de TIPO de ACESSO durante uma declaração de variáveis:-
const
-
volatile
const
- variáveis declaradas
const
podem ser inicializadas mas não modificadas - usar
const
é útil quando vc. quer ter certeza que (parte do) seu código não irá alterar valores de certas variáveis; uma situação típica é na declaração de CONSTANTES SIMBÓLICAS, como em:
const double PI = 3.1415927;
- Uma outra situação é quando vc. passa um argumento a uma função através de um parâmetro e deseja que o valor do argumento não seja em hipótese alguma modificado pelo código da função ... Mais detalhes somente em aulas futuras ...
volatile
- este ESPECIFICADOR indica que a variável pode sofrer modificações de maneira não especificada pelo programa. Em outras palavras, uma variável
volatile
pode ter seu conteúdo alterado (via apontadores e endereços) por comandos que fazem parte de outros programas. - Na prática,
volatile
indica ao compilador para não realizar otimização de EXPRESSÕES contendo tais variáveis.
Observação :
- Os ESPECIFICADORES
const
evolatile
podem ser utilizados juntos! - Exemplo:
const volatile unsigned short int port = 80;
- Neste exemplo, a variável
port
não pode ser modificado pelo programa sendo escrito mas pode ter seu valor modificado por comandos externos ao programa!
Atividade 1: Variáveis const:
Teste o código abaixo e observe o Erro de Compilação !const int x = 100; int main() { x = x + 1; /* Isto irá gerar um erro de compilação */ }
Inicialização de Variáveis
Inicializar uma variável significa dar à variável um valor, no mesmo momento em que ela é declarada.De maneira geral, o valor inicial de uma variável pode ser o resultado de uma EXPRESSÃO envolvendo dentre outros CONSTANTES, OPERADORES e outras VARIÁVEIS.
Regras de Inicialização
- Variáveis GLOBAIS e variáveis LOCAIS
static
declaradas COM=INICIALIZADOR
são inicializadas com o valor deINICIALIZADOR
apenas uma vez no começo do programa - Variáveis GLOBAIS e variáveis LOCAIS
static
declaradas SEM=INICIALIZADOR
são inicializadas com ZERO apenas uma vez no começo do programa - Variáveis LOCAIS
auto
eregister
declaradas COM=INICIALIZADOR
são inicializadas com o valor deINICIALIZADOR
toda vez que o BLOCO no qual foram declaradas for ativado - Variáveis LOCAIS
auto
eregister
declaradas SEM=INICIALIZADOR
têm valor DESCONHECIDO antes de ser efetuada uma primeira atribuição a elas - Apenas DECLARAÇÕES que são DEFINIÇÕES podem conter
=INICIALIZADOR
. Assim, variáveis declaradasextern
não podem ser inicializadas no momento de suas declarações!
Atividade 2 : Inicialização de Variáveis
Compile, execute e compare a saída do programa abaixo com o que foi dito acima sobre inicialização de variáveis:#include <stdio.h> int Gi = 3, G_; /* variáveis GLOBAIS */ void f(); /* DEClARAÇAO de f() */ void g() { /*DECLARACAO/DEFINICAO de g() */ char ga_; printf("\n. g():\n"); printf(" ga_ = %i\n", ga_); printf("\n > para terminar digite 't' < "); scanf(" %c",&ga_); if (ga_ != 't' ) f(); /* ativa função f() */ printf("\n# g():\n"); } void f() { /* DEFINICAO de f() */ static int fsi = 3, fs_; int fai = 3, fa_; printf("\n. f():\n"); printf(" fsi = %i\n", fsi); printf(" fs_ = %i\n", fs_); printf(" fai = %i\n", fai); printf(" fa_ = %i\n", fa_); fsi ++; fs_ ++; fai ++; fa_ ++; printf("\n Após incremento:\n\n"); printf(" fsi = %i\n", fsi); printf(" fs_ = %i\n", fs_); printf(" fai = %i\n", fai); printf(" fa_ = %i\n", fa_); g(); /* ativa função g() */ printf("\n# f():\n"); } int main () { int m_; printf("\n. main()\n"); printf(" Gi = %i\n",Gi); printf(" G_ = %i\n",G_); printf(" m_ = %i\n",m_); f(); /* Ativa função f() */ printf("\n# main()\n"); }
Constantes:
Um dos elementos principais na INICIALIZAÇÃO de VARIÁVEIS (e de EXPRESSÕES em geral) são as constantes.Constantes são VALORES ESPECÍFICOS de qualquer um dos TIPOS de DADOS básicos.
Observações
- Nas constantes caracter e string, além dos caracteres comuns, caracteres de controle (não imprimíveis) são escritos através de um 'código de barra invertida' (veja tabela abaixo)
- Não confunda constantes caracter com string! Uma constante de um único caracter é colocada entre aspas simples; constantes string são colocadas entre aspas duplas. Ou seja,
-
'a'
(constantechar
) é diferente de"a"
(constante string)
-
Leitura Recomendada:
- CCT capítulo 2
- K&R capítulos 2 e 4
Exercícios:
- Considere o programa da atividade 2. Descreva passo a passo como o ambiente de execução (área estática de dados + pilha de execução) evolui durante a execução do programa. Na sua descrição localize onde são alocadas as variáveis do programa.
- Explique qual a diferença entre '0', '\0', "0" .
- A matemática e a física é repleta de exemplos de constantes fundamentais. Utilizando variáveis decladas com o ESPECIFICADOR
const
, mostre como você representaria as seguintes constantes abaixo:- razão áurea (φ);
- número de Euler (e);
- velocidade da luz no vácuo (c);
- massa do elétron em repouso (me);
- número de Avogadro (L);
- Escreva um programa que converta números de decimais para hexadecimal e octal. Dica: uma maneira simples de fazer o programa é ler os números em decimal e os imprimir na tela como constantes inteiras escritas em hexadecimal e octal. Para saber como usar a função
printf
para imprimir inteiros em hexadecimal e octal cosulte os livros ou a internet. Veja por exemplo, a página abaixo: - O programa abaixo, quando compilado, gera uma mensagem de erro.
- Que mensagem de erro é essa?
- Como o programa pode ser corrigido para eliminar a mensagem de erro?
- Após o programa ter sido corrigido e compilado com sucesso, que valores serão impressos na tela ?
- [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
- LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
- [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
- DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
- Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.
Coloque aqui o seu email