Qual a diferença entre #define e const em C? Explique com código:
#define PI 3.14159
const float e = 2.71828;

Passo 1

Beleza, vamos lá! A pergunta é sobre a diferença entre #define e const na linguagem C. Isso faz parte do conteúdo de definição de constantes em programação. Para resolver isso, vamos precisar entender o que cada um faz, como eles funcionam e ver exemplos de código.

Passo 2

Primeiro, vamos falar sobre #define. Ele é uma diretiva de pré-processador em C. Isso significa que antes do código ser compilado, o pré-processador substitui todas as ocorrências de #define pelo valor que você definiu. Não há verificação de tipo, é uma substituição pura e simples.
Por exemplo:
#define PI 3.14159
Aqui, sempre que usarmos PI no código, o pré-processador vai substituir por 3.14159.

Passo 3

Agora, vamos falar sobre const. Quando usamos const, estamos declarando uma variável constante. Isso significa que o valor dessa variável não pode ser alterado durante a execução do programa. Ao contrário de #define, o const é verificado pelo compilador, o que ajuda a evitar erros de tipo.
Por exemplo:
const float e = 2.71828;
Aqui, e é uma variável do tipo float que não pode ser modificada depois de definida.

Passo 4

Vamos comparar os dois:
  1. Tipo de Verificação:
    • #define: Não há verificação de tipo. O compilador simplesmente substitui o texto.
    • const: O compilador verifica o tipo, garantindo que você use o valor corretamente.
  2. Escopo:
    • #define: Tem escopo global durante todo o pré-processamento.
    • const: Respeita o escopo da linguagem C, podendo ser local ou global.
  3. Depuração:
    • #define: Pode ser mais difícil de depurar porque a substituição é feita antes da compilação.
    • const: Facilita a depuração já que o valor está associado a uma variável com tipo.

Resposta

Em resumo, #define é usado para substituir valores durante o pré-processamento sem verificação de tipo, enquanto const define constantes com verificação de tipo e escopo controlado pelo compilador. Usar const geralmente é preferível por causa da segurança de tipo e melhor integração com o compilador.

Exercícios relacionados