Vamos dar uma olhada em um programa C simples. Este programa, mostrado no Código 2.1, serve para apontar alguns dos recursos básicos da programação em C. Antes de ler a próxima explicação linha por linha do programa, leia o Código 2.1 para ver se você consegue descobrir por si mesmo o que isso fará.


#include <stdio.h> /* Inclui o arquivo de cabeçalho stdio.h */
         
int main (void)    /* Função principal que inicia a aplicação */
{  
   int num;        /* Declara uma variável do tipo inteiro */                  
   num = 1;        /* Atribui um valor à variável numm */
         
   /* Usa a função printf() para imprimir mensagens no Terminal */        
   printf("Eu sou um simples ");        
   printf("computador.\n");       
   printf("Meu numero favorito eh %d porque ele eh o primeiro.\n", num);

return 0;
}

Se você acha que este programa irá imprimir algo na sua tela, você está certo! Exatamente o que será impresso pode não ser aparente, então execute o programa e veja os resultados. Primeiro, vá no Visual Code Studio ou use seu editor favorito do seu compilador para criar um arquivo contendo o texto do Código 2.1. Dê ao arquivo um nome que termine em “.c” e que atenda aos requisitos de nome do seu sistema local. Você pode usar cod21.c , por exemplo. Agora compile. Veja o comando no terminal:

gcc -std=c11 cod21.c -o program.exe

ou

gcc -g cod21.c -o program.exe

Para executar o arquivo program.exe no terminal, se for no prompt comando do Windows, basta digitar program. Mas se você estiver usando o Visual Studio Code, que integra o Power Shell do Windows, para ter uma experiência de sistemas Unix-Like, apenas digite o seguinte comando:

./program.exe

ou

./program

Veja que no segundo caso não foi necessário colocar a extensão “.exe”.

Veja o resultado quando invocamos o executável pelo terminal:

Eu sou um simples computador.

Meu numero favorito eh 1 porque ele eh o primeiro.

Terminal do Power Shell do Visual Studio Code

Resumindo, esse resultado não é muito surpreendente, mas o que aconteceu com os “\n”, e com o “%d” no programa? E algumas linhas do programa parecem estranhas! É hora de uma boa explicação.

Ajustando o programa, caso você utilize uma IDE, quando executado o programa, através de um botão “run”, e venha aparecer uma janela de Terminal do Prompt Comando e depois desapareça.

A saída deste programa abriu um terminal brevemente na tela e depois desapareceu? Alguns ambientes de desenvolvimento executam o programa em uma janela separada e fecham automaticamente quando o programa termina. Nesse caso, você pode fornecer um código extra para fazer com que a janela permaneça aberta até você pressionar uma tecla. Uma maneira é adicionar a seguinte linha antes da instrução return:

getchar();

Este código faz com que o programa aguarde um “pressionamento” de tecla, de forma que a janela permaneça aberta até que você pressione, por exemplo, o Enter.


#include
<stdio.h> /* Inclui o arquivo de cabeçalho stdio.h */   int main (void)     /* Função principal que inicia a aplicação */ {   int num;        /* Declara uma variável do tipo inteiro */            num = 1;        /* Atribui um valor à variável numm */   /* Usa a função printf() para imprimir mensagens no Terminal */      printf("Eu sou um simples ");       printf("computador.\n");      printf("Meu numero favorito eh %d porque ele eh o primeiro.\n", num);

getchar();

return 0;

}
O exemplo explicado

Faremos duas passagens pelo código-fonte do programa. A primeira passagem (“Passagem 1: Sinopse Rápida”) destaca o significado de cada linha para ajudá-lo a ter uma ideia geral do que está acontecendo. A segunda etapa (“Passagem 2: Detalhes do Programa”) explora implicações e detalhes específicos para ajudá-lo a obter uma compreensão mais profunda. A Figura a seguir resume as partes de um programa C; inclui mais elementos do que nosso primeiro exemplo usa.

Anatomia de um programa em C

Passo 1: Sinopse Rápida

Esta seção apresenta cada linha do programa seguida de uma breve descrição; a próxima seção (Passo 2) explora mais detalhadamente os tópicos levantados aqui.

#include <stdio.h>

O comando acima seria o mesmo que incluir outro arquivo. Ou seja, esta linha diz ao compilador para incluir as informações encontradas no arquivo stdio.h , que é uma parte padrão de todos os pacotes do compilador C; este arquivo fornece suporte para entrada de teclado (input) e exibição de saída (output).

A diretiva # (hashtag) significa pré-processador! Ou melhor, “#” é uma diretiva de pré-processador que tem a função de realizar algo antes do pré-processamento de compilação! Esse fazer algo é o comando include, que traduzindo, seria um comando para incluir algo entre o sinal de menor (<) e sinal de maior (>).

Veja que std significa standard, que em português é o mesmo que padrão. O caractere “i” tem o significado de input (entrada); e “o”, de output (saída). Então o arquivo de cabeçalho stdio.h seria um arquivo de entrada e saída padrão. A extensão “h” significa header (cabeçalho), por isso arquivo de cabeçalho.

Os programas C consistem em uma ou mais funções, os módulos básicos de um programa C. Este programa consiste em uma função chamada main. Os parênteses identificam main() como o nome de uma função. O int indica que a função main() retorna um número inteiro e o void indica que main() não aceita nenhum argumento. Esses são assuntos que abordaremos mais tarde. No momento, basta aceitar int e void como parte da maneira padrão ANSI C para definir main().

OBS: Se você tiver um compilador C pré-ANSI, omita void; você pode querer obter algo mais recente para evitar incompatibilidades.

Como fazer comentários para documentação: /* um programa simples */

Os símbolos /* e */ incluem comentários – observações que ajudam a esclarecer um programa. Eles são destinados apenas ao leitor e são ignorados pelo compilador.

/* è Abre o comentário.

*/ è Fecha o comentário.

Início do corpo da função, que seria o abre chaves: {

Esta chave de abertura marca o início das instruções que compõem a função. Uma chave de fechamento ( } ) marca o fim da definição da função.

Declarando o nome de uma variável e seu tipo: int num;

int num;          // variável com nome “num” do tipo inteiro

Esta instrução anuncia que você está usando uma variável chamada num e que num será um int (inteiro – em inglês seria integer).

Fazendo uma atribuição de um valor inteiro a uma variável, no caso, “num” que recebe o valor inteiro 1.

num = 1;

A instrução num = 1; atribui o valor 1 à variável chamada num.

OBS: O sinal de igual “=” não significa que num é igual a 1! Este sinal simboliza uma atribuição. O valor está sendo atribuído a uma variável, mas nunca o local deste armazenamento (variável) será igual ao valor atribuído, porque, na maioria dos casos, as variáveis podem variar de valores! Em outras palavras, as variáveis são locais ou posições nas memórias do computador que guardam um valor de cada vez! Se o número 1 está guardado na variável num, e depois você queira colocar o número 10, então sairá o número 1 e ficará guardado o número 10.

Uma instrução de chamada de função: printf(“Eu sou um simples”);

A primeira instrução usando printf() exibe a frase “Eu sou um simples” na tela, deixando o cursor na mesma linha. Aqui printf() faz parte da biblioteca C padrão. É denominado função. E usar uma função no programa é denominado chamada de função.

Outra instrução de chamada de função: printf(“computador.\n”);

A próxima chamada para a função printf() segue no computador até o final da última frase impressa. O \n é um código que informa ao computador para iniciar uma nova linha – ou seja, para mover o cursor para o início da próxima linha.

Observe, porém, que os caracteres “\n” não são exibidos na tela. A barra invertida (\) é chamada de caractere de escape. Ela indica que a função printf deve fazer algo fora do esperado. Quando uma barra invertida “\” é encontrada em uma string de caracteres, o compilador examina o próximo caractere e o combina com a barra invertida para formar uma sequência de escape. Portanto, esta sequência de escape “\n” significa nova linha (newline). Quando uma sequência de nova linha aparece na string de saída, através de uma função printf, a nova linha faz com que o cursor se posicione no início da próxima linha na tela. Algumas sequências de escape comuns são listadas na tabela seguinte.

Sequência de escape

Descrição

\n

Nova linha. Posiciona o cursor da tela no início da próxima linha.

\t

Tabulação horizontal. Move o cursor da tela para a próxima posição de tabulação.

\a

Alerta. Faz soar o alarme do sistema.

\\

Barra invertida. Insere um caractere de barra invertida em uma string.

\”

Aspas. Insere um caractere de aspas em uma string.
printf(“Meu número favorito é %d porque é o primeiro.\n”, num);

O último uso da função printf() imprime o valor de num (que é 1 ) incorporado na frase entre aspas. O %d instrui o computador, onde e de que forma, imprimir o valor de num. Esse %d significa que é um especificador de conversão, indicando que um inteiro será exibido. O “d” indica que é um número decimal do tipo inteiro. O caractere “%” é tratado como um caractere especial, que inicia um especificador de conversão. Neste caso, seria um especificador para um número inteiro decimal (%d). Ele não será imprimido no terminal, mas apenas será substituído pelo valor da variável que é o número inteiro 1. Ele apenas vai indicar que será substituído pelo próximo argumento. No exemplo acima, o argumento correspondente seria o “num” após a vírgula.

Uma declaração de retorno para a função do tipo inteiro: return 0;

return 0;

Uma função C pode fornecer ou retornar um número para o agente que o utilizou. Simplesmente irá indicar que o programa concluiu com sucesso! Por enquanto, considere esta linha como o fechamento apropriado para uma função main().

Fim da função main(): }

}

Como prometido, o programa termina com chave de fechamento.

Passo 2: Detalhes do Programa

Agora que você tem uma visão geral do Código 2.1, daremos uma olhada mais de perto. Mais uma vez, examinaremos as linhas individuais do programa, desta vez usando cada linha de código como ponto de partida para aprofundar os detalhes por trás do código e como base para desenvolver uma perspectiva mais geral dos recursos de programação em C.

#include Diretivas e Arquivos de Cabeçalho
#include <stdio.h>

Esta é a linha que inicia o programa. O efeito de #include <stdio.h> é o mesmo que se você tivesse digitado todo o conteúdo do arquivo stdio.h em seu arquivo no ponto onde a linha #include aparece. Na verdade, é uma operação de copiar/recortar e colar. Os arquivos da pasta include fornecem uma maneira conveniente de compartilhar informações comuns a muitos programas.

A instrução #include é um exemplo de diretiva de pré-processador C. Em geral, os compiladores C realizam algum trabalho preparatório no código-fonte antes de compilar; isso é denominado pré-processamento.

O arquivo stdio.h é fornecido como parte de todos os pacotes do compilador C. Ele contém informações sobre funções de entrada (input) e saída (output), como printf() , para uso do compilador. O nome significa cabeçalho de entrada/saída padrão – (stands for standard input/output headerstd + i (input) + o (output) .h (header)). As pessoas, que programam na linguagem C, chamam de cabeçalho uma coleção de informações que vai no topo de um arquivo, e suas implementações geralmente vêm com vários arquivos de cabeçalho.

Na maior parte, os arquivos de cabeçalho contêm informações usadas pelo compilador para construir o programa executável final. Por exemplo, eles podem definir constantes ou indicar os nomes das funções e como devem ser utilizadas. Mas o código real de uma função está em um arquivo de biblioteca de código pré-compilado, não em um arquivo de cabeçalho. O componente vinculador (linker) do compilador se encarrega de encontrar o código da biblioteca que você precisa. Resumindo, os arquivos de cabeçalho ajudam a orientar o compilador na montagem correta do seu programa.

A ANSI/ISO do C padronizou quais arquivos de cabeçalho um compilador C deve disponibilizar. Alguns programas precisam incluir stdio.h e outros não. A documentação para uma implementação C específica deve incluir uma descrição das funções da biblioteca C. Estas descrições de funções identificam quais arquivos de cabeçalho são necessários. Por exemplo, a descrição de printf() diz para usar stdio.h . A omissão do arquivo de cabeçalho adequado pode não afetar um programa específico, mas tenha essa confiança. Cada vez que esta explicação usar funções de biblioteca, ele usará os arquivos de inclusão especificados pelo padrão ANSI/ISO para essas funções.

Observe por que a entrada e a saída não estão integradas

Talvez você esteja se perguntando por que recursos tão básicos como entrada (input) e saída (output) não são incluídos automaticamente. Uma resposta é que nem todos os programas usam esse pacote de E/S (entrada/saída) – I/O (input/output), e parte da filosofia de C é evitar carregar peso desnecessário. Este princípio de uso econômico de recursos torna C popular para programação embarcada – por exemplo, escrever código para um chip que controla um sistema de combustível automotivo ou um reprodutor de Blu-ray. Aliás, a linha #include nem sequer é uma declaração da linguagem C! O símbolo # na linha 1 identifica o local como deve ser manipulado pelo pré-processador C antes que o compilador assuma o controle. Você encontrará mais exemplos de instruções de pré-processador posteriormente!

A função principal main()
int main(void)

A próxima linha do programa proclama uma função chamada main . É verdade que main é um nome bastante simples, mas é a única opção disponível. Um programa C (com algumas exceções com as quais não nos preocuparemos) sempre começa a execução com a função chamada main() . Você é livre para escolher nomes para outras funções que usar, mas main() deve estar lá para iniciar as coisas. E os parênteses? Eles identificam main() como uma função. Você aprenderá mais sobre funções em breve. Por enquanto, lembre-se de que funções são os módulos básicos de um programa C.

O int é o tipo de retorno da função main(). Isso significa que o tipo de valor que main() pode retornar é um número inteiro. Voltar para onde? Para o sistema operacional – depois voltaremos a esta questão!

Os parênteses após o nome de uma função geralmente incluem informações que são transmitidas à função. Para este exemplo simples, nada está sendo repassado, então os parênteses contêm a palavra void (vazio). (“Sequências de caracteres e funções de string”, apresenta um segundo formato que permite que informações sejam passadas para main() do sistema operacional.)

Se você navegar pelo código C antigo, verá frequentemente programas começando com o seguinte formato:

main()

O padrão C90 tolerou esta forma de má vontade, mas os padrões C99 e C11 não! Portanto, mesmo que seu compilador atual permita fazer isso, não faça isso!

A seguir veja uma outra maneira de escrever:

void main()

Mas cuidado! Alguns compiladores permitem isso, mas nenhum dos padrões jamais listou isso como uma opção reconhecida ou opcional. Portanto, os compiladores não precisam aceitar esta forma, e vários não o reconhecem!. Novamente, siga o formato padrão e você não terá problemas se mover um programa de um compilador para outro.

 

Comentários
/* um programa simples */

As partes do programa entre os símbolos /* */ são comentários. O uso de comentários torna mais fácil para alguém (inclusive você) entender seu programa. Uma característica interessante dos comentários em C é que eles podem ser colocados em qualquer lugar, até mesmo na mesma linha do material que explicam. Um comentário mais longo pode ser colocado em sua própria linha ou até mesmo espalhado por mais de uma linha. Tudo entre a abertura /* e o fechamento */ é ignorado pelo compilador. A seguir estão alguns formulários de comentários válidos e inválidos:

 
/* Este é um comentário C. */
  /* Este comentário, sendo um tanto prolixo, está espalhado por duas linhas. */ /* Você também pode fazer isso. */   /* Mas isso é inválido porque não há marcador final.

C99 adicionou um segundo estilo de comentários, popularizado por C++ e Java. O novo estilo usa os símbolos // para criar comentários confinados a uma única linha:

   
  // Aqui está um comentário confinado a uma linha.
  int variavel ; // Esses comentários também podem ir aqui.

Como o final da linha marca o fim do comentário, esse estilo precisa de marcadores de comentário apenas no início do comentário.

O arquivo mais recente é uma resposta a um problema potencial com o arquivo antigo. Suponha que você tenha o seguinte código:


/*
Eu espero que isso funcione. */ x = 100; y = 200; /* Agora, outra coisa. */

Em seguida, suponha que você decida remover a quarta linha e excluir acidentalmente a terceira linha (o */ ) também. O código então se torna:


/*
Eu espero que isso funcione. y = 200; /* Agora, outra coisa. */

Agora o compilador emparelha /* na primeira linha com */ na quarta linha, transformando todas as quatro linhas em um comentário, incluindo a linha que deveria fazer parte do código. Como o formulário // não se estende por mais de uma linha, ele não pode levar a esse problema de “desaparecimento de código”.

Alguns compiladores podem não suportar esse recurso; outros podem exigir a alteração de uma configuração do compilador para ativar os recursos C99 ou C11.

Esta explicação, baseada na teoria de que consistência desnecessária pode ser enfadonha, utiliza ambos os tipos de comentários.

Chaves, corpos e blocos
{
     …
}

Na Código 2.1, as chaves “{ .. }” delimitam a função main(). Em geral, todas as funções C usam chaves para marcar o início e também o fim do corpo de uma função. A presença deles é obrigatória, por isso não os deixe de fora. Somente chaves ( { } ) funcionam para essa finalidade, não parênteses ( ( ) ) e nem colchetes ( [ ] ).

Chaves também podem ser usadas para reunir instruções dentro de uma função em uma unidade ou bloco. Se você estiver familiarizado com Pascal, ADA, Modula-2 ou Algol, reconhecerá os colchetes como sendo semelhantes no início e no fim nessas linguagens.

Declarações
int num;

Esta linha do programa é chamada de instrução de declaração. A instrução de declaração é um dos recursos mais importantes de C. Este exemplo específico declara duas coisas. Primeiro, em algum lugar da função, você tem uma variável chamada num. Segundo, o int proclama num como um número inteiro – ou seja, um número sem ponto decimal ou parte fracionária. (int é um exemplo de tipo de dados.) O compilador usa essas informações para organizar espaço de armazenamento adequado na memória para a variável num. O ponto-e-vírgula no final da linha identifica a linha como uma instrução em C. O ponto-e-vírgula faz parte da instrução! Ele não é apenas um separador entre instruções como em Pascal.

A palavra int é uma palavra-chave em C que identifica um dos tipos básicos de dados de C. As Palavras-chave são palavras usadas para expressar uma linguagem e você não poderá usá-las para outros fins. Por exemplo, você não pode usar int como o nome de uma função ou de uma variável. No entanto, essas restrições de palavras-chave não se aplicam fora da linguagem, portanto, não há problema em nomear um gato ou um filho favorito com a palavra int. Mas ficará estranho! Imagine você dizendo ao seu filho: –  Int, me dê aqui para o papai ou para a mamãe!

A palavra num neste exemplo é um identificador — isto é, um nome que você seleciona para uma variável, uma função ou alguma outra entidade. É um nome que você escolhe quando vai ter um filho! Precisa criar na memória uma entidade com um nome! Assim, a declaração conecta um determinado identificador a um determinado local na memória do computador e também estabelece o tipo de informação, ou tipo de dados, a ser armazenado naquele local.

Variável num com tipo inteiro

Em C, todas as variáveis devem ser declaradas antes de serem usadas. Isso significa que você deve fornecer listas de todas as variáveis ​​que usa em um programa e mostrar qual é o tipo de dados de cada variável. Declarar variáveis é considerada uma boa prática de programação e, em C, é obrigatória.

Tradicionalmente, C exige que as variáveis sejam declaradas no início de um bloco, sem que nenhum outro tipo de instrução possa vir antes de qualquer uma das declarações. Ou seja, o corpo de main() pode ter a seguinte aparência:

     
#include <stdio.h>
              
int main() // regras tradicionais              
{              
     int doors; // declara doors como tipo inteiro               
     int dogs;  // declara dogs como tipo inteiro
                 
     doors = 5; // atribui valor inteiro 5 à variável doors           
     dogs = 3;  // atribui valor inteiro 3 à variável dogs
            
     //outras declarações
            
     return 0;            
} 

C99 e C11, seguindo a prática do C++, permitem colocar declarações sobre qualquer lugar em um bloco. No entanto, você ainda deve declarar uma variável antes de seu primeiro uso. Portanto, se o seu compilador suportar esse recurso, seu código poderá ser semelhante ao seguinte:

 
#include <stdio.h>
                
int main() // regras tradicionais               
{              
     int doors; // declara doors como tipo inteiro          
     doors = 5; // atribui valor inteiro 5 à variável doors 
                   
    // mais declarações
              
     int dogs;  // declara dogs como tipo inteiro            
     dogs = 3;  // atribui valor inteiro 3 à variável dogs         
     
                
     //outras declarações
                
     return 0;               
}
                   

Para maior compatibilidade com sistemas mais antigos, esta explicação seguirá a convenção original. Neste ponto, você provavelmente tem três perguntas. Primeiro, quais são os tipos de dados? Em segundo lugar, que opções você tem ao selecionar um nome? Terceiro, por que você precisa declarar variáveis? Vejamos algumas respostas.

Tipos de dados

A linguagem C lida com vários tipos (ou tipos) de dados: inteiros, caracteres e ponto flutuante, por exemplo. Declarar uma variável como um número inteiro ou um tipo de caractere permite que o computador armazene, busque e interprete os dados adequadamente. Depois vamos investigar a variedade de tipos disponíveis nas próximas explicações!

Escolha do nome

Você deve usar nomes significativos ou intuitivos (ou identificadores) para variáveis (como ovelha_cont em vez de x3 se seu programa contar ovelhas). Tome cuidado para não criar um nome como 3x. Nunca comece os identificadores de variáveis com números! E também não coloque espaços: 3 x. A seguir, veremos o que pode e o que não pode!

Se o nome não for suficiente, use comentários para explicar o que as variáveis representam. Documentar um programa dessa maneira é uma das técnicas básicas de uma boa programação.

Com C99 e C11 você pode deixar o nome de um identificador tão longo quanto desejar, mas o compilador precisa considerar apenas os primeiros 63 caracteres como significativos. Para identificadores externos apenas 31 caracteres precisam ser reconhecidos. Este é um aumento substancial em relação ao requisito C90 de 31 caracteres e seis caracteres, respectivamente, e os compiladores C mais antigos geralmente paravam no máximo de oito caracteres. Na verdade, você pode usar mais do que o número máximo de caracteres, mas o compilador não é obrigado a prestar atenção aos caracteres extras. O que isto significa? Se você tiver dois identificadores com 63 caracteres cada e idênticos, exceto por um caractere, o compilador deverá reconhecê-los como distintos um do outro. Se você tiver dois identificadores com 64 caracteres e idênticos, exceto o caractere final, o compilador poderá reconhecê-los como distintos ou não; a norma não define o que deve acontecer nesse caso.

Os caracteres à sua disposição são letras minúsculas, letras maiúsculas, dígitos e sublinhado (_). O primeiro caractere deve ser uma letra ou um sublinhado. A seguir estão alguns exemplos:

Nomes Válidos

Nomes Inválidos

number

$Z]**

cat2

2cat

Hot_Tub

Hot-Tub

taxRate

tax rate

_value

_ não

valor_2

valor 2

Os sistemas operacionais e a biblioteca C geralmente usam identificadores com um ou dois caracteres de sublinhado iniciais, como em _value, portanto, é melhor evitar esse uso. Os rótulos padrão que começam com um ou dois caracteres de sublinhado, como identificadores de biblioteca, são reservados. Isso significa que embora não seja um erro de sintaxe usá-los, pode levar a conflitos de nomes.

Os nomes em C diferenciam maiúsculas de minúsculas (case-sensitive), o que significa que uma letra maiúscula é considerada distinta da letra minúscula correspondente. Portanto, estrelas são diferentes de Estrelas e ESTRELAS.

Quatro boas razões para declarar variáveis

Algumas linguagens mais antigas, como as formas originais de FORTRAN e BASIC, permitem usar variáveis sem declará-las. Então, por que você não pode adotar essa abordagem fácil em C? Aqui estão alguns motivos:

  • Colocar todas as variáveis em um só lugar torna mais fácil para o leitor entender do que se trata o programa. Isto é particularmente verdadeiro se você der nomes significativos às suas variáveis (como taxa de imposto em vez de r ). Se o nome não for suficiente, use comentários para explicar o que as variáveis representam. Documentar um programa dessa maneira é uma das técnicas básicas de uma boa programação.
  • Pensar em quais variáveis declarar incentiva você a fazer algum planejamento antes de começar a escrever um programa. De quais informações o programa precisa para começar? O que exatamente eu quero que o programa produza como saída? Qual é a melhor forma de representar os dados?
  • Declarar variáveis ajuda a evitar um dos bugs mais sutis e difíceis de encontrar na programação: o nome da variável com erro ortográfico. Por exemplo, suponha que em alguma linguagem que não possui declarações, você fez a declaração:

         RAIO1 = 20,4;

       e que em outro lugar do programa você   digitou errado

        CIRCUM = 6,28 * RAIOI;

  • Você involuntariamente substituiu o numeral 1 pela letra l (l maiúsculo). Essa outra linguagem criaria uma nova variável chamada RAIOl e usaria qualquer valor que tivesse (talvez zero, talvez lixo – garbage). A variável CIRCUM receberia o valor errado e você pode ter muita dificuldade para descobrir o porquê. Isso não pode acontecer em C (a menos que você tenha sido bobo o suficiente para declarar dois nomes de variáveis semelhantes) porque o compilador irá reclamar quando o RAIOl não declarado aparecer.
  • Seu programa C não será compilado se você não declarar suas variáveis. Se as razões anteriores não conseguirem convencê-lo, você deve pensar seriamente nisso.

 

Dado que você precisa declarar suas variáveis, para onde elas vão? Como mencionado anteriormente, C antes de C99 exigia que as declarações fossem no início de um bloco. Uma boa razão para seguir esta prática é que agrupar as declarações torna mais fácil ver o que o programa está fazendo. Claro, há também uma boa razão para espalhar as suas declarações, como a C99 agora permite. A ideia é declarar variáveis antes de você estar pronto para atribuir um valor a elas. Isso torna mais difícil esquecer de dar-lhes um valor. Na prática, muitos compiladores ainda não suportam a regra C99.

Atribuição
num = 1;

A próxima linha do programa é uma instrução de atribuição, uma das operações básicas em C. Este exemplo específico significa “atribuir o valor 1 à variável num”. A instrução anteriormente “int num;” significa reservar espaço na memória do computador para a variável num, enquanto a próxima linha “num = 1;”  seria a atribuição que armazena um valor nesse local.

Você pode atribuir a num um valor diferente posteriormente, se desejar; é por isso que num é denominado variável. Porque varia de valor! Observe que a instrução de atribuição atribui um valor do lado direito para o lado esquerdo. Além disso, a instrução é completada com ponto-e-vírgula, conforme mostrado na imagem a seguir.

A instrução de atribuição é uma das operações básicas do C
A função printf()
printf(“Eu sou um simples “);
printf(“computador.\n”);
printf(“Meu número favorito eh %d porque eh o primeiro.\n”, num);

Todas essas linhas usam uma função C padrão chamada printf() . Os parênteses significam que printf é um nome de função. O conteúdo entre parênteses é a informação passada da função main() para a função printf(). Por exemplo, a primeira linha passa a frase “Eu sou um simples” para a função printf(). Essa informação é chamada de argumento ou, mais detalhadamente, de argumento real de uma função (veja a Figura a seguir). (C usa os termos argumento e parâmetro para distinguir entre um valor específico enviado para uma função e uma variável na função usada para armazenar o valor; O argumento é o que é enviado na chamada de uma função! O Parâmetro é quando existe uma variável da função que recebe as informações do argumento na chamada. O que a função printf() faz com este argumento? Ele analisa tudo o que está entre aspas duplas e imprime esse texto na tela.

A função printf() com um argumento

Esta primeira linha printf() é um exemplo de como você chama ou invoca uma função em C. Você precisa digitar apenas o nome da função, colocando o(s) argumento(s) desejado(s) entre parênteses. Quando o programa atinge esta linha, o controle é transferido para a função nomeada (printf() neste caso). Quando a função termina o que quer que faça, o controle é retornado para a função original (na chamada) — main(), neste exemplo.

E a próxima linha printf()? Tem os caracteres \n incluídos entre aspas e eles não foram impressos! O que está acontecendo? O símbolo \n significa iniciar uma nova linha. A combinação \n (digitada como dois caracteres) representa um único caractere chamado caractere de nova linha. Para printf(), significa “iniciar uma nova linha na margem esquerda”. Em outras palavras, imprimir o caractere de nova linha executa a mesma função que pressionar a tecla Enter de um teclado típico. Por que não usar a tecla Enter ao digitar o argumento printf()? Isso seria interpretado como um comando imediato para o seu editor, não como uma instrução a ser armazenada no seu código-fonte. Em outras palavras, ao pressionar a tecla Enter, o editor sai da linha atual na qual você está trabalhando e inicia uma nova. O caractere de nova linha, entretanto, afeta a forma como a saída do programa é exibida.

O caractere de nova linha é um exemplo de sequência de escape. Uma sequência de escape é usada para representar caracteres difíceis ou impossíveis de digitar. Outros exemplos são \t para Tab (Tabulação) e \b para Backspace (Voltar para trás). Em cada caso, a sequência de escape começa com o caractere de barra invertida, \ . Depois voltaremos a esse assunto!

Bem, isso explica por que as três instruções printf() produziram apenas duas linhas: A primeira instrução de impressão não tinha um caractere de nova linha, mas a segunda e a terceira tinham.

A linha printf() final traz outra estranheza: o que aconteceu com %d quando a linha foi impressa? Como você deve se lembrar, a saída para esta linha foi:

Meu numero favorito eh 1 porque eh o primeiro.

Aha! O dígito 1 foi substituído pelo grupo de símbolos %d quando a linha foi impressa e 1 foi o valor da variável num . O %d é um local no argumento reservado para mostrar onde o valor de num deve ser impresso. Esta linha é semelhante à seguinte instrução BASIC:

PRINT “Meu numero favorito eh “; num; ” porque eh o primeiro.”

A versão C faz um pouco mais do que isso! Na verdade, o caractere % alerta o programa que uma variável deve ser impressa naquele local, e o d diz para ele imprimir a variável como um número inteiro decimal (base 10). A função printf() permite diversas escolhas para o formato das variáveis impressas, incluindo números inteiros hexadecimais (base 16) e números com casas decimais. Na verdade, o f em printf() é um lembrete de que esta é uma função de impressão de formatação. Cada tipo de dados tem seu próprio especificador – à medida que as explicações introduzem novos tipos, eles também apresentam os especificadores apropriados.

Declaração de retorno
return 0;

Esta declaração de retorno é a declaração final do programa. O int, na linha int main(void), significa que a função main() deve retornar um número inteiro. O padrão C exige que main() se comporte dessa maneira. As funções C que retornam valores fazem isso com uma instrução return, que consiste apenas na palavra-chave return , seguida pelo valor retornado, e depois seguido por um ponto-e-vírgula. Se você deixar de fora a instrução return para main(), o programa retornará 0 quando chegar ao fechamento }. Portanto, você pode omitir a instrução return no final de main(). No entanto, você não pode omiti-lo de outras funções, por isso é mais consistente usá-lo em main() também. Neste ponto, você pode considerar a instrução return em main() como algo necessário para consistência lógica, mas ela tem uso prático com alguns sistemas operacionais, incluindo Linux e Unix.


Referências:

C Primer Plus:

PRATA, Stephen. C Primer Plus. 6. ed. São Paulo: Pearson Education do Brasil, 2014.

C Como Programar (Nova Edição Atualizada):

DEITEL, Paul; DEITEL, Harvey. C Como Programar (Nova Edição Atualizada). 6. ed. São Paulo: Pearson Education do Brasil, 2014.


 

Categorias