Manual da Linguagem GNU C
Doar para o tradutorDoar para os autores
  • Linguagem GNU C
  • Prefácio
  • 1️1. O Primeiro Exemplo
    • Fibonacci Recursiva
      • Cabeçalho da Função
      • Corpo da Função
    • Pilha e Estouro de Pilha
    • Fibonacci Iterativa
  • 📦2. Um Programa Completo
    • Exemplo de um Programa Completo
    • Explicação do Programa Completo
    • Programa Completo Linha por Linha
    • Compilando o Programa de Exemplo
  • 👜3. Armazenamento e Dados
  • 🥑4. Além dos Inteiros
    • Um Exemplo com Números Não Inteiros
    • Um Exemplo com Arrays
    • Variações para o Exemplo com Array
  • ✍️5. Sintaxe Lexical
    • Escreva Programas em Inglês!
    • Caracteres
    • Espaços em Branco
    • Comentários
    • Identificadores
    • Operadores e Pontuação
    • Continuação de Linha
  • ➕6. Aritmética
    • Aritmética Básica
    • Aritmética de Inteiros
    • Estouro de Inteiros
      • Estouro de Inteiros sem Sinal
      • Estouro de Inteiros com Sinal
    • Aritmética em Modo Misto
    • Divisão e Resto
    • Comparações Numéricas
    • Operações de Deslocamento
      • Deslocar Gera Novos Bits
      • Advertências em Operações de Deslocamento
      • Hacks com Deslocamento
    • Operações Bit-a-bit
  • 🟰7. Expressões de Atribuição
    • Atribuição Simples
    • Lvalues
    • Atribuição Modificadora
    • Operadores de Incremento e Decremento
    • Pós-incremento e Pós-decremento
    • Armadilha: Atribuição em Subexpressões
    • Escreva Atribuições em Instruções Separadas
  • 🕹️8. Expressões de Controle de Execução
    • Operadores Lógicos
    • Operadores Lógicos e Comparações
    • Operadores Lógicos e Atribuições
    • Expressão Condicional
    • Operador Vírgula
  • 🐫9. Gramática dos Operadores Binários
  • 🏁10. Ordem de Execução
    • Reordenação de Operandos
    • Associatividade e Ordenação
    • Pontos de Sequência
    • Pós-incremento e Ordenação
    • Ordenação de Operandos
    • Otimização e Ordenação
  • 🎲11. Tipos Primitivos
    • Tipos de Dados Inteiros
      • Inteiros Básicos
      • Tipos Com ou Sem Sinal
      • Inteiros Estreitos
      • Conversão entre Tipos Inteiros
      • Tipo Booleano
      • Variações de Inteiros
    • Tipos de Dados de Ponto Flutuante
    • Tipos de Dados Complexos
    • O Tipo Void
    • Outros Tipos de Dados
    • Designadores de Tipos
  • 🪨12. Constantes
    • Constantes do Tipo Inteiro
    • Tipos de Dados de Constantes do Tipo Inteiro
    • Constantes de Ponto Flutuante
    • Constantes de Números Imaginários
    • Constantes de Caracteres
    • Constantes do Tipo String
    • Constantes do Tipo String UTF-8
    • Códigos de Caracteres Unicode
    • Constantes do Tipo Caractere Largo
    • Constantes do Tipo String Larga
  • 📐13. Tamanho de Tipo
  • Apêndices
    • F - GNU Free Documentation License
    • G - GNU General Public License
Fornecido por GitBook
Nesta página

Isto foi útil?

Editar no GitHub
Exportar como PDF
  1. 4. Além dos Inteiros

Variações para o Exemplo com Array

O código para chamar a função avg_of_double tem duas declarações que começam com o mesmo tipo de dado:

  /* O array de valores para calcular a média.  */
  double nums_to_average[5];
  /* A média, uma vez que a calculamos.  */
  double average;

Em C, você pode combinar as duas, assim:

  double nums_to_average[5], average;

Isso declara nums_to_average para que cada um de seus elementos seja um double, e average para que seja simplesmente um double.

No entanto, embora você possa combiná-las, isso não significa que deva. Se for útil escrever comentários sobre as variáveis, e geralmente é, então é melhor manter as declarações em linhas separadas para que você possa colocar um comentário em cada uma. Isso também ajuda ao usar editores de texto para encontrar ocorrências de uma variável nos arquivos de código-fonte.

Em arquivos grandes de código-fonte, pode ser que você queira encontrar o momento da declaração de uma variável utilizando um editor de texto como vim, Visual Studio Code, Notepad++, etc. Por exemplo, você pode buscar por int num para buscar a declaração de uma variável chamada num, que é tipo int. No entanto, se você declarar mais de uma variável na mesma linha como em int i, num, j;, a busca por int num não encontraria esta ocorrência. Além da clareza, este é o motivo pelo qual os autores desencorajam este tipo de declaração.

Definimos então todos os elementos do array nums_to_average com atribuições, mas é mais conveniente usar um inicializador na declaração:

{
  /* O array de valores para calcular a média.  */
  double nums_to_average[]
    = { 58.7, 5.1, 7.7, 105.2, -3.14159 };

  /* A média, uma vez que a calculamos.  */
  double average = avg_of_double ((sizeof (nums_to_average)
                                   / sizeof (nums_to_average[0])),
                                  nums_to_average);

  /* …agora faça uso da média… */
}

O inicializador do array é uma lista de valores separados por vírgulas, delimitados por chaves. Veja .

Note que a declaração não especifica um tamanho para nums_to_average, então o tamanho é determinado a partir do inicializador. Há cinco valores no inicializador, então nums_to_average recebe o comprimento 5. Se adicionarmos outro elemento ao inicializador, nums_to_average terá seis elementos.

Como o código calcula o número de elementos a partir do tamanho do array, usando sizeof, o programa operará em todos os elementos no inicializador, independentemente de quantos sejam.

No código de exemplo, uma certa aritimética é utilizada para pegar o tamanho do array, que é 5, já que este é inicializado com 5 elementos. A técnica consiste em utilizar o operador sizeof, que retorna o tamanho de um tipo em tempo de compilação, diretamente no array e dividir esse resultado pelo tamanho de qualquer um dos elementos do array, já que todos são do mesmo tipo (normalmente o primeiro elemento, de índice 0, é o escolhido).

Para entender como isto functiona, suponha que uma variável do tipo double ocupe 8 bytes de memória. Isso significa que um array de double com 5 elementos vai ocupar 40 bytes. Ao dividir 40 pelo tamanho de um dos elementos, que é 8, você obtém o número de elementos do array, que é 5 neste caso.

Fazer isso faz com que você possa adicionar ou remover elementos na inicialização do array sem se preocupar em atualizar o valor do tamanho do array, já que as operações com o sizeof irão calcular o tamanho do array novamente.

Só lembre-se que isto é em tempo de compilação, ou seja, é preciso recompilar o programa para alterar os elementos com os quais o array é inicializado. Só assim sizeof retornará o valor atualizado do tamanho do array.

AnteriorUm Exemplo com ArraysPróximo5. Sintaxe Lexical

Atualizado há 7 meses

Isto foi útil?

🥑