VP Developer

Aprendendo Linguagem C

published: 2026-03-31

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ção printf. 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ção main).
  • 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 string embutido.
  • Arrays de Caracteres: Em C, string são representadas como listas (arrays) de caracteres.
  • Sintaxe char: De forma simplificada, usamos char * 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 o print() 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 usamos 1 para true e 0 para 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 int pode 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:
  1. Inicialização: Executada uma única vez no ínicio (ex. int i = 0;).
  2. Condição: Verificada antes de cada volta. Se for falsa, o loop termina (ex. i < 5;).
  3. 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 while comum é que o do while executa 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 o while é 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 .h vá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, #define e #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.