Aula 07 – Comentários no Código

Documentando programas em C — tipos de comentário, boas práticas e comparação com Java

O que são Comentários?

Comentários são trechos de texto inseridos no código-fonte que o compilador ignora completamente — eles existem apenas para os seres humanos que leem o código. Um bom comentário explica o porquê de uma decisão de programação, não simplesmente o que a linha faz (o código já mostra isso).

Um comentário é qualquer texto delimitado pelos marcadores de comentário do C. O compilador remove todos os comentários antes de processar o código, portanto eles não têm nenhum efeito sobre o comportamento do programa.
Por que comentar o código?

Comentário de Linha: //

O comentário de linha começa com // e se estende até o final da linha. Tudo após o // naquela linha é ignorado pelo compilador. É o tipo mais comum para anotações rápidas e explicações curtas.

// texto ignorado até o final da linha

Introduzido no padrão C99. Não estava disponível no C original (ANSI C / C89), mas é suportado por todos os compiladores modernos, incluindo o MinGW no Code::Blocks.
#include <stdio.h>

int main() {
    int idade = 25;          // idade do usuário em anos
    float altura = 1.75;     // altura em metros
    float imc;

    // Cálculo do IMC: peso / (altura ao quadrado)
    imc = 70.0 / (altura * altura);

    printf("IMC: %.2f\n", imc); // exibe com 2 casas decimais

    return 0; // encerra o programa com sucesso
}

IMC: 22.86

DICA — comentário ao final da linha: Comentários no final de uma linha de código (chamados de inline comments) são úteis para explicar o propósito de uma variável ou o significado de um valor específico. Mantenha-os curtos — se precisar de mais de uma linha para explicar, use um comentário de bloco acima do código.

Comentário de Bloco: /* ... */

O comentário de bloco começa com /* e termina com */. Pode se estender por quantas linhas forem necessárias. É o único tipo de comentário disponível no C original (antes de C99) e é amplamente usado para cabeçalhos de arquivo e documentação de funções.

/* texto comentado — pode ocupar várias linhas */

Disponível desde o C original (ANSI C / C89). Não pode ser aninhado: o primeiro */ encontrado encerra o comentário, mesmo que haja outro /* dentro.
/*
 * Programa: calculadora_basica.c
 * Autor:    João Silva
 * Data:     2024-03-15
 * Descrição: Demonstra as quatro operações aritméticas
 *            com entrada do usuário.
 */

#include <stdio.h>

/*
 * Função: exibirResultado
 * Parâmetros: op (char) - operador usado
 *             a, b (int) - operandos
 *             resultado (float) - resultado da operação
 */
void exibirResultado(char op, int a, int b, float resultado) {
    printf("%d %c %d = %.2f\n", a, op, b, resultado); /* formatação padronizada */
}

int main() {
    int x = 15, y = 4;

    exibirResultado('+', x, y, x + y);
    exibirResultado('-', x, y, x - y);
    exibirResultado('*', x, y, x * y);
    exibirResultado('/', x, y, (float)x / y); /* cast para divisão real */

    return 0;
}

15 + 4 = 19.00

15 - 4 = 11.00

15 * 4 = 60.00

15 / 4 = 3.75

Comentários de bloco não podem ser aninhados: O trecho abaixo causa erro de compilação, pois o primeiro */ encerra o comentário antes do esperado:
/* comentário externo /* interno */ ainda comentário? */
// O compilador vê: /* comentário externo /* interno */
// e depois tenta compilar: "ainda comentário? */"  ← ERRO
Para comentar blocos que já contêm comentários, use comentários de linha // em cada linha, ou use diretivas de compilação condicional (#if 0 ... #endif).

Desabilitando Código Temporariamente

Uma das utilizações práticas dos comentários é desabilitar temporariamente trechos de código durante o desenvolvimento, sem apagá-los. Isso é útil para testar alternativas ou isolar bugs.

Usando // para comentar linhas individuais

int main() {
    int x = 10;

    // printf("Versão antiga: %d\n", x * 2);  // desabilitada temporariamente
    printf("Versão nova: %d\n", x * x);        // versão atual

    return 0;
}

Usando #if 0 para blocos maiores

Para comentar grandes blocos que já contêm comentários, a técnica mais segura em C é usar a diretiva de pré-processador #if 0:

#include <stdio.h>

int main() {
    int x = 42;

#if 0
    /* Este bloco inteiro é ignorado pelo compilador */
    printf("Código antigo: %d\n", x);
    /* outro comentário interno — sem problema aqui */
    x = x * 2 + 1;
    printf("Resultado antigo: %d\n", x);
#endif

    printf("Resultado atual: %d\n", x); // apenas esta linha executa

    return 0;
}

Resultado atual: 42

DICA: #if 0 ... #endif é o método preferido para comentar blocos grandes em C porque: (1) funciona mesmo que o bloco contenha comentários /* */, e (2) é fácil de encontrar e reativar — basta mudar #if 0 para #if 1.

Boas Práticas de Comentário

Comentar bem é uma habilidade que se desenvolve com a prática. Veja a diferença entre comentários que agregam valor e comentários que apenas repetem o óbvio:

Comentários ruins — evite

Comentários que apenas repetem o que o código já diz são ruído — aumentam o tamanho do arquivo sem agregar informação.
// incrementa i em 1
i++;

// declara variável x do tipo int e atribui 5
int x = 5;

// verifica se a é maior que b
if (a > b) {
    // imprime "a é maior"
    printf("a é maior\n");
}

Comentários bons — pratique

Bons comentários explicam o porquê, documentam casos especiais, fórmulas não triviais e decisões de projeto que não são óbvias pela leitura do código.
// Incrementa i para avançar ao próximo elemento do array
// (arrays em C não têm método .next() como em Java)
i++;

// Usa divisão inteira intencionalmente para descartar os centavos
int valor_em_reais = total_centavos / 100;

// Fórmula de Bhaskara — discriminante negativo indica raízes complexas
float delta = b*b - 4*a*c;
if (delta < 0) {
    printf("Raízes complexas — sem solução real.\n");
    return 1; // encerra com código de erro
}

// Buffer de leitura: +1 para o caractere nulo '\0' que termina strings em C
char nome[51]; // suporta até 50 caracteres + '\0'

Cabeçalho de arquivo — padrão recomendado

Todo arquivo .c ou .h deve começar com um bloco de comentário descrevendo seu propósito:

/*
 * Arquivo:   molecular_energy.c
 * Autor:     Caio Lima Firme
 * Criado em: 2024-01-10
 * Descrição: Cálculo de energia molecular usando o método
 *            Hartree-Fock com base STO-3G.
 *
 * Compilar:  gcc molecular_energy.c -o mol -lm
 */

#include <stdio.h>
#include <math.h>

Documentação Automática com Doxygen

Para projetos maiores, é comum usar comentários no estilo Doxygen — uma ferramenta que lê comentários especialmente formatados e gera documentação HTML ou PDF automaticamente. O estilo usa /** (dois asteriscos) e tags especiais:

/**
 * @brief Calcula a área de um círculo.
 *
 * Utiliza a fórmula: A = π × r²
 * onde π é aproximado por PI_MACRO (3.14159).
 *
 * @param raio  O raio do círculo em metros (deve ser positivo).
 * @return      A área em metros quadrados, ou -1.0 se raio <= 0.
 */
float areaCirculo(float raio) {
    if (raio <= 0) return -1.0f;
    return 3.14159f * raio * raio;
}
Tags Doxygen mais usadas: Doxygen é padrão em projetos científicos e industriais em C — e é muito utilizado em projetos de química computacional como os estudados neste curso.

Comentários em C versus Java

As sintaxes de comentário são praticamente idênticas nas duas linguagens. A principal diferença está na ferramenta de documentação automática utilizada por cada ecossistema:

Aspecto C Java
Comentário de linha // texto (desde C99) // texto (idêntico)
Comentário de bloco /* texto */ /* texto */ (idêntico)
Comentário de documentação /** ... */ — processado pelo Doxygen /** ... */ — processado pelo Javadoc
Tags de documentação @param, @return, @brief (Doxygen) @param, @return, @author (Javadoc)
Comentar blocos grandes #if 0 ... #endif (método mais seguro) /* ... */ (funciona pois Java não tem pré-processador)
Aninhamento de /* */ Não permitido — causa erro de compilação Não permitido — causa erro de compilação
// no C original (C89) Não existia — foi introduzido no C99 Sempre disponível em Java

Código equivalente nas duas linguagens

C Java
/*
 * Calcula o quadrado de um número.
 * @param n - número inteiro
 * @return n ao quadrado
 */
int quadrado(int n) {
    return n * n; // operação simples
}
/**
 * Calcula o quadrado de um número.
 * @param n número inteiro
 * @return n ao quadrado
 */
int quadrado(int n) {
    return n * n; // operação simples
}

Exercícios — Aula 07

Teste seus conhecimentos sobre comentários em C:

1. O que o compilador C faz com os comentários no código-fonte?

2. Em qual padrão do C o comentário de linha // foi introduzido?

3. O código abaixo compila corretamente? Por quê?

/* comentário /* aninhado */ ainda comentário? */
printf("ok\n");

4. Qual é a forma mais segura de comentar um grande bloco de código em C que já contém comentários /* */?

5. Qual dos comentários abaixo representa uma boa prática?

6. Qual ferramenta de documentação automática é usada no ecossistema C, equivalente ao Javadoc do Java?

7. Analise o código. Qual linha será executada?

#if 0
    printf("Linha A\n");
    printf("Linha B\n");
#endif
    printf("Linha C\n");

8. Qual tag Doxygen é usada para documentar o valor de retorno de uma função?