[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
signedeunsignedint
signedeunsignedlongeshortfloat,doubleelong double- OPCIONALMENTE, um ESPECIFICADOR da CLASSE de MEMÓRIA
autoregisterstaticextern
- 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
-
constevolatile
-
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
constpodem 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
volatilepode ter seu conteúdo alterado (via apontadores e endereços) por comandos que fazem parte de outros programas. - Na prática,
volatileindica ao compilador para não realizar otimização de EXPRESSÕES contendo tais variáveis.
Observação :
- Os ESPECIFICADORES
constevolatilepodem ser utilizados juntos! - Exemplo:
const volatile unsigned short int port = 80;
- Neste exemplo, a variável
portnã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
staticdeclaradas COM=INICIALIZADORsão inicializadas com o valor deINICIALIZADORapenas uma vez no começo do programa - Variáveis GLOBAIS e variáveis LOCAIS
staticdeclaradas SEM=INICIALIZADORsão inicializadas com ZERO apenas uma vez no começo do programa - Variáveis LOCAIS
autoeregisterdeclaradas COM=INICIALIZADORsão inicializadas com o valor deINICIALIZADORtoda vez que o BLOCO no qual foram declaradas for ativado - Variáveis LOCAIS
autoeregisterdeclaradas SEM=INICIALIZADORtê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 declaradasexternnã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
printfpara 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