#+title: Curso Básico da Linguagem C #+subtitle: Aula 2: Dados e instruções #+author: Blau Araujo #+startup: show2levels #+options: toc:3 * Aula 2: Dados e instruções [[https://youtu.be/2KsvRJjshQ0][Vídeo desta aula]] Programas podem ser entendidos como formas de manipular dados através de instruções para realizar tarefas. ** Instruções - Declarações de variáveis e funções - Atribuições e alterações de variáveis - Chamadas de funções - Retorno de funções, etc... #+begin_quote Toda instrução simples é terminada com =;=. #+end_quote ** Dados - Constantes simbólicas - Expressões constantes - Operações lógicas e aritméticas - Valores retornados por funções - Endereços de memória, etc... #+begin_quote Tudo que expressa um valor é chamado de /expressão/. #+end_quote ** Exemplo (=x10.c=) #+begin_src c #include int main(void) { int num; num = 5; printf("%d x 10 = %d\n", num, num * 10); return 0; } #+end_src *** O que temos aqui: - =int num;= → Declaração da variável =num=. - =num = 5;= → Atribuição de um valor à variável =num=. - =printf(...);= → Chamada da função =printf=. - ="%d x 10 = %d\n"= → Primeiro argumento da função =printf=. - =num= → Acesso ao dado na variável =num=. - =num * 10= → Dado na variável =num= vezes =10=. ** Outro exemplo (=x10const.c=) #+begin_src c #include #define MULT 10 // Multiplicador. int main(void) { int num = 5; printf("%d x 10 = %d\n", num, num * MULT); return 0; } #+end_src *** O que há de novo: - =#define MULT 10= → Definição da constante simbólica =MULT=. - =int num = 5;= → Inicialização da variável =num= na própria declaração. - =num * MULT= → Dado em =num= vezes a expansão de =MULT=. #+begin_quote O valor de =MULT= será expandido no pré-processamento! #+end_quote ** Mais um exemplo (=quadrado.c=) #+begin_src c #include int quadrado(int base) { return base * base; } int main(void) { int num = 5; printf("%d^2 = %d\n", num, quadrado(num)); return 0; } #+end_src *** O que há de novo desta vez: - =int quadrado(int base)...= → Definição da função =quadrado=. - =return base * base= → Retorno da função =quadrado=. - =quadrado(num);= → Chamada da função =quadrado=. ** Dúvidas *** Para que serve a função =main=? A função =main= é o /ponto de entrada/ do programa, ou seja, é o ponto a partir do qual o programa começará a ser executado. Quando a função =main= termina, o programa é terminado retornando um valor inteiro (=int=) para o sistema, que utilizará este valor como /estado de término/ do programa. *** Qual é o significado de =void=? No exemplo da aula, =void= (que significa /vazio/) é utilizado para explicitar que a função =main= não receberá argumentos: #+begin_src c int main(void) { /* ... */ } #+end_src Isso não é obrigatório e existem situações em que a função =main= receberá dados do ambiente de execução (sistema operacional), como argumentos de linha de comando e variáveis exportadas para o programa, por exemplo: #+begin_src c int main(int arg, char **argv) { /* ... */ } #+end_src #+begin_quote A palavra-chave =void= tem outros usos não relacionados com o caso do exemplo da aula. #+end_quote *** Por que o tipo do retorno de =main= é =int=? Para atender às especificações da linguagem ([[https://bolha.dev/blau_araujo/cblc/raw/branch/main/c17/iso-iec-9899-2017.pdf#subsection.5.1.2][5.1.2.2.1 Program startup]]). *** A função =main= poderia retornar outros tipos de dados? Em tese, sim, mas a função =main= tem um papel diferenciado e deve seguir as especificações da linguagem. [[https://youtu.be/IoLhY1teyOo][Video sobre o retorno da função main]]. *** A função =main= poderia retornar uma string? Além do que foi respondido antes, nenhuma função pode retornar /vetores/: e /strings/ são vetores de caracteres terminados com o caractere nulo (=\0=). *** Por que o cabeçalho =stdio.h= foi incluído no programa? Para que pudéssemos utilizar a função =printf=. A linguagem C implementa muito poucas instruções nativas, deixando a implementação de outras funcionalidades e abstrações para as funções da biblioteca C padrão. Por sua vez, a biblioteca C padrão é muito grande e possui centenas de funções implementadas. Então, para otimizar o acesso a elas, nós só precisamos das declarações das funções que serão efetivamente utilizadas nos nossos programas. Nós poderíamos fazer essas declarações nos códigos onde elas fossem utilizadas, mas a própria biblioteca padrão oferece vários /arquivos de cabeçalhos/: arquivos contendo declarações de funções e outras definições, que podem ser inseridos nos nossos códigos apenas quando necessário. - [[https://youtu.be/fdZYpZFUAZE][Vídeo sobre cabeçalhos e bibliotecas (parte 1)]] - [[https://youtu.be/Sl-kJ6w0QaU][Vídeo sobre cabeçalhos e bibliotecas (parte 2)]]