LINGUAGEM: Linguagem C - Capítulo 1 - Parte 4



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 e unsigned
    • int
      • signed e unsigned
      • long e short
    • float, double e long 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 e volatile
Além disso, discutiremos as regras gerais do processo de INICIALIZAÇÃO de VARIÁVEIS e ao final apresentaremos a forma das CONSTANTES associadas aos tipos básicos de dados em C.

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 e volatile 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 de INICIALIZADOR 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 e register declaradas COM =INICIALIZADOR são inicializadas com o valor de INICIALIZADOR toda vez que o BLOCO no qual foram declaradas for ativado
  • Variáveis LOCAIS auto e register 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 declaradas extern 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' (constante char) é diferente de "a" (constante string)

Leitura Recomendada:

  • CCT capítulo 2
  • K&R capítulos 2 e 4

Exercícios:

  1. 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.
  2. Explique qual a diferença entre '0', '\0', "0" .
  3. 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);
  4. 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:
  5. O programa abaixo, quando compilado, gera uma mensagem de erro.
    1. Que mensagem de erro é essa?
    2. Como o programa pode ser corrigido para eliminar a mensagem de erro?
    3. Após o programa ter sido corrigido e compilado com sucesso, que valores serão impressos na tela ?



Bibliografia e fonte:

  • [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.