Aprendendo Linguagem C
Estrutura de Programação C
#include <stdio.h>
int main(){
printf("Program in C!\n");
}Diferente do Python, que executa o código por linha de cima para baixo, o C exige uma função chamada de main como ponto de entrada obrigatória.
- Componentes básicos:
int main()indica que a função retorna um número inteiro (códgio de saída). 0 significa que tudo correu bem. - Sintax: Usa-se chaves
{}para o corpo da função e;para terminar comandos. - Impressão: É necessário incluir a biblioteca
<stdio.h>e usar a funçãoprintf. O\né essencial para pular linha.
C é compilada
print("starting")
func_that_doesnt_exists("uh oh")
print("finished") - Python(Interpretada): O código é executado linha por linha. No exemplo, ele consegue imprimir "starting" antes de encontrar a função inexistente e travar.
- C (Compilada): O Compilador analisa todo o código antes da execução. Se houver um erro (como uma função que não existe), o programa nem chega a rodar; o erro é apontado antecipadamente.
- Segurança: O C oferece uma camada de proteção inicial ao detectar erros de estrutura, embora não consiga prever todos os problemas que podem surgir durante o uso do programa.
Tipos de Dados
int: Números inteiros (como o usado no retorno da funçãomain).float: Números com casasa decimais (ponto flutuante).char: Representa um único caractere.char *: Uma sequência (array) de caracteres - o que funciona como as strings.
Diferente de Python, no C você é obrigado a declarar o tipo de variável antes do nome e da atribuição do valor.
String
- Sem tipo "String" nativo: Diferente de linguagens modernas, o C não possui um tipo de dado
stringembutido. - Arrays de Caracteres: Em C, string são representadas como listas (arrays) de caracteres.
- Sintaxe
char: De forma simplificada, usamoschar *para declarar o que chamamos de string. - Aspas Importam: É obrigatório usar aspas duplas(
") para strings. Aspas simples (') servem apenas para um único caractere (char).
Diferente do Python, C não permite inserir variáveis diretamente no meio do texto. Usamos "especificadores de formato"par indicar onde e como os valores aparecem.
- Principais Códigos:
%d: Números inteiros.%c: Caractere único.f%: Ponto flutuante (decimais).%s: Strings (char *)
- Controle Manual: O
\né indispensável para pular linhas, já que o C não faz isso automaticamente como oprint()do python.
É um pouco mais trabalhaso, mas te dá total controle sobre a formatação!
Função
- Tipagem Obrigatória: Diferente do Python, você deve declarar explicitamente o tipo do retorno e de cada parâmetro (ex:
float add(int x, int y)). - Casting (Conversão): O uso de
(float)instrui o C a converter o resultado da soma de inteiros para um número décimal. - Consistência: O C exige que a função retorno sempre o mesmo tipo de dado, o que evita erros comuns no Python, onde uma função pode retorna tipos diferentes dependendo do caminho percorrido.
O C é bem rigoroso, mas essa previsibilidade é o que torna o código mais robusto!
Void
- Sem Argumentos: Para declarar explicitamente que uma função não recebe nenhuma parâmetro (ex:
int minha_função(void)). - Sem Retorno: Para indicar que uma função executa uma tarefa, mas não devolve nenhum valor (ex. funções que apenas impirimem algo na tela).
Diferença: Ao contrário do none Python, o void não é um valor. Você não pode atribuí-lo a uma variável; ele serve apenas como uma instrução para o compilador sobre a estrutura da função.
Operadores Lógicos em C
- Os Três Pialres:
&&(E lógico),||(OU lógico)!(NÃO lógico/inversão). - Avaliação de Curto-Circuito: O C é intelignete! No
&&, se a primeira condição for falsa, ele nem olha a segundo. No||, se a primeira for verdadeira, ele também para ali. Isso é excelente para evitar erros, como uma divisão por zero. - Precedência: A ordem de importância é
!, depois&&e, por fim,||. Dica: use parênteses para garantir que o códgico faça exatamente o que você quer!
#include "<stdio.h>"
int can_access_registry(int is_premium, int reputation, int has_2fa) {
if (is_premium != 0) {
return 1;
} else if ( reputation >= 100 && has_2fa != 0) {
return 1;
} else {
return 0;
}
} Em C, nós usamos1para true e0para falso ao retornar valores boleanos de funções que retornam inteiros.
Operador ternário em C
- O que é: -Uma forma compacta de escrever um if/else simples em apenas uma linha, assim como no Javascript
- Sintaxe:
codinção ? valor_se_verdadeiro : valor_se_falso. - Uso Ideal: É excelente para atribuições diretas, como definir o maior valor entre dois números em uma unica expressão.
Dica O autor recomenda cautela. Embora úteis, exagerar nos ternários pode tornar o código difício de ler. Em C, muitas vezes é melhor usar um bloco if tradicional para manter a clareza.Tipos de dados em C
- Variabilidade: O tamanho em memória não é fixo; ele depende da arquitetura do sistema (32-bit vs. 640-bit). Por exemplo um
intpode variar entre 4 e 8 bits. - Tamanhhaos Típicos:
char: Sempre 1 byte.float: Geralmente 4 bytes (precisão simples).double: Geralmente 8 bytes ( precisão dupla).
Regra - Para saber o tamanho exato de qualquer tipo no seus sistema, você deve usar o operador sizeof.Loop em C
- Sem "for each": Diferente do Python, o C não permite iterar diretamente sobre itens (como
for car in cars). Você deve usar índices numéricos. - As Três Partes do Controle:
- Inicialização: Executada uma única vez no ínicio (ex.
int i = 0;). - Condição: Verificada antes de cada volta. Se for falsa, o loop termina (ex.
i < 5;). - Expressão Final: Executada após o corpo do loop, geralemnte para atualizar o contador (ex:
i++).
- Sintaxe:
for (inicialização; condição; expressão-final) { //corpo do loop }.
O C exige que você gerencie manualmente o progresso de repetição, o que ofereceu um controle muito mais granular sobre a execução
Exemplo: Loop Básico
#include <stdio.h>
int main(){
for (int i = 0; i < 5; i++) {
printf("%d\n, i);
}
return 0
}Loop While
- Funcionamento: Ele executa um bloco de código repetidamente enquanto uma condição é verdadeira.
- Verificação Antecipada: A condição é testada antes de cada iteração. Se for falsa logo de cara , o loop nem começa
- Risco de Loop Infinito: Se a condição nunca se tornar falsa (por exemplo, se você esqecer de incrementar o
i++), o programa rodará pra sempre!
Diferente do for, o while é ideal quando você não sabe exatamente quantas vezes precisará repetir a tarefa, apenas que ele deve continuar até que um critério mude.
Exemplo: While Loop
#include <stdio.h>
int main() {
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
return 0;
}Loop Do While
- Execução Garantida: A grande diferença para o
whilecomum é que odo whileexecuta o código pelo menos uma vez, pois a condição só é verificada ao final do bloco. - Sintaxe:
do { ... } while (condição);, em códgico normal, o ponto e vírgula após owhileé obrigatório. - Uso em Macros: É uma técnica cássica em C para criar macros segurs, permitindo que um bloco de código seja tratado como uma única instrução "vazar" variáveis o resto do programa.
- Comportamento: Se você iniciar uma variável em 100 e a condição for
i < 5, o loop ainda assim imprimirá o valor 100 uma vez antes de para.
Pragma Once e Header Guards
- O Problema: Incluir o mesmo arquivo
.hvárias vezes gera erros de redifinição de funções ou estruturas, o que trava a compilação. - Pragma Once: É a solução moderna e mais simples. Basta uma linha no topo do arquivo para garantir que o compilador o processe apenas uma vez.
- Header Guards: A técnica tradicional que usa
#ifndef,#definee#endif. Ele cria uma "trava" manual baeada em macros para evitar duplicidade. - Conclusão: Embora ambos funcionnem, o
#pragma onceé mais rápido e menos propenso a erros humanos.
Conclusão
Concluímos os fundamentos C, passamos pela estrutura básica (main), a tipagem rígida e a natureza das strings como arrays qude caracteres (char*). Vimos como o C, por ser uma linguagem compilada, exige precisão absoluta antes mesmo da execução. Exploramos a lógica com operadores, anatomia das funções com void e o controle de repetição com loops (for, while e o do while). Por fim, entendemos como proteger nossos arquivos de cabeçalho com #pragma once. Comparado ao Python, o C oferece um controle "próximo ao metal" muito maior, mas exige que você gerencie cada detalhe manualmente.