Não use números, use constantes: const e #define

Como saber se uma pessoa já pode ser presa? Fácil, pela idade:
if(idade>=18) ou if(idade>17)

Como saber se uma pessoa já pode votar? Fácil, pela idade:
if(idade>=16) ou if(idade>15)

Parece certo, não é? A rigor, está sim.
Está correto, mas absolutamente não recomendável. Vamos explicar isso neste tutorial de C de nossa apostila.

Como ser um programador C certificado

Por que se deve evitar usar números em programação C

Imagine que você foi contratado para fazer um programa para o governo federal.
Dentre outras coisas, seu aplicativo C deve dizer ao cidadão se ele está apto a dirigir, votar, se alistar nas Forças Armadas, doar sangue, viajar sozinho, idade pro homem se aposentar, pra mulher, tempo de serviço e milhares de outras coisas.

Facilmente, em seu código, você iria ultrapassar os milhares de testes condicionais, iria usar várias idades: 14, 16, 18, 21, 60, 65 e outras.
Isso pra você não é problema e faz todo sentido. E em um projeto profissional, é comum um programa ter dezenas de milhares de linhas de código.

Agora vamos mostrar os riscos do uso desses números.
Imagine que o governo mudou a maioridade penal: agora jovens de 16 anos podem ser presos.
Devido aos acidentes, somente pessoas com 21 anos, ou mais, podem comprar bebida alcoólica.
E como o país está crescendo e as pessoas melhoraram seu nível profissional, podem se aposentar com menos tempo de serviço.

E agora, José? Sair vasculhando milhares de testes condicionais, loopings, funções, bibliotecas em milhares de linhas de código, procurando esses números?
“Ah, vai em SEARCH e REPLACE ALL”. Errado, nem tudo deve mudar.
Nem todos os números ‘18’ (no caso da maioridade penal) vão mudar pra ‘16’ (pra se alistar, continua 18).

Pode ter certeza, isso iria levar semanas e é quase impossível fazer isso sem erros, sem ter deixado passar algo ou ter mudado algo que não devia. As complicações são muitas, e o ato de usar esses números em uma aplicação grande é irresponsabilidade, embora seja um erro catastrófico e básico, infelizmente muitos programadores que são profissionais ainda cometem esse tipo de barbaridade. Concordo com você, deviam ser queimados em praça pública (brincando).

Mas não se preocupe você estudou pelo curso C Progressivo, e caso tenha lido nossas lições e feitos os exercícios, garantimos sua competência.


Definindo e usando constantes em C

Existem, basicamente, duas maneiras de definir constantes em linguagem C:
Através do comando const e da diretiva de pré-processamento: #define

Um costume dos programadores C é declarar essas constantes no começo do programa, depois dos #include .

A sintaxe para declarar constantes usando a palavra reservada const é:
const tipo_da_variavel nome_da_variavel = valor_da_variavel;

Ou seja, é como declarar uma variável qualquer, como vínhamos fazendo.
A diferença é a palavra const no início, e o fato de termos que inicializar a variável.

É como se tivéssemos definido uma variável, e de fato é alocado um espaço em memória para essa constante, que será acessado sempre que usarmos essa variável.

O que é diferente do #define, que na verdade não faz parte da linguagem C, é algo que vem antes, é um comando pro pré-processador que ocorre antes da compilação.

A sintaxe para usar o #define é a seguinte:
#defina nome_da_variavel valor_da_variavel

Isso mesmo, sem símbolo de igual, sem o tipo de variável e sem ponto-e-vírgulo.
É como se disséssemos ao C: “Hey C, troque cada aparição da palavra ‘nome_da_variavel’ por ‘valor_da_variavel’, e só depois compile”.

Exemplo de código:
Crie um aplicativo em C que peça ao usuário sua idade, e diga se ele já pode dirigir (se tiver 16 anos ou mais), se alistar (se tiver 18 anos ou mais) e se já pode se aposentar(65 anos ou mais).
Use constantes: const e #define.

#include <stdio.h>
#define MAIORIDADE 18
const int aposentadoria = 65;
const int motorista = 16;

int main()
{
    int idade;
    printf("Digite sua idade: ");
    scanf("%d", &idade);

    if( idade >= MAIORIDADE )
        printf("Voce ja pode se alistar e dirigir.\n");
    else
        if( idade >= motorista )
            printf("Voce pode dirigir, mas nao pode se alistar.\n");
        else
            printf("Voce nao pode dirigir nem se alistar\n");

    if( idade >= aposentadoria )
        printf("Voce ja pode se aposentar!\n");
}

Note que na #define usamos letras maiúsculas, pois é um costume entre programadores C.

8 comentários:

Anônimo disse...

ultra interessante

Alexandre Richard disse...

Obrigado novamente! Coloquei algumas instruções que achei bacana no meu código e gostaria de compartilhar. Segue:

#include
#define MAIORIDADE 18
const int aposentadoria = 65;
const int motorista = 18;




int main()
{
int idade;
printf("Informe sua idade.\n");
scanf("%d", &idade);

if(idade >= MAIORIDADE)
printf("Vc pode dirigir com %d anos.\n\n", idade);

else
if(idade <= motorista)
printf("Ainda nao permitido dirigir com %d anos. Joge GTA.\n\n", idade);

if(idade <= aposentadoria)
printf("Vc ainda nao pode se aposentas com %d anos. \n", idade);
printf("Aguarde %d anos para sua aposetandoria!\n\n", aposentadoria - idade);


}
Att
Alexandre

Anônimo disse...

<= se o usuário digitar 18 vai entrar na condição de não poder dirigir, de uma olhada no código e faça alguns testes.

Robson Araújo Lima disse...

Mas, quando devo usar const?

Wesley disse...

Quando for CONSTANTE, caso não vá mudar de condição nem tão cedo

100% novidades disse...

qual a utilidade de const e define? eu poderia simplesmente declarar uma variável e usá-la

MAURICIO GILBERTI disse...

Parabéns pelo site.
Manual fodástico sobre programação em C, direto, simples e completo.

Melksedek disse...

Como foi feito o calculo e quanto tempo falta para a pessoa aposentar ou dirigir no seu programa Alexandre Richard?

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.