LINGUAGEM C: TUDO O OQUE VOCÊ PRECISA SABER EM UM ÚNICO LUGAR

ÍNDICE DE CONTEÚDO




Introdução sobre a linguagem C

A linguagem C é uma linguagem de programação de alto nível que foi criada nos anos 1970 para desenvolvimento de sistemas operacionais. Ela é amplamente utilizada em sistemas embarcados.

A seguir é apresentado um resumo das principais estruturas da linguagem C. Serão apresentados as Estruturas Básicas, Tipos de Dados, Operadores, Estruturas de Controle de Fluxo, Funções, Vetores e Matrizes, Ponteiros e Structs.

Use esse guia sempre que tiver dúvidas sobre algum tópico da linguagem C. Ao final do texto você encontrará mais artigos e referências com tópicos avançados e aplicações da linguagem C em sistemas embarcados.

Dica: Para reproduzir os códigos exemplos apresentados, você pode usar a ferramenta: OnlineGDB



Variáveis

As variáveis são locais de armazenamento em memória onde os dados podem ser armazenados e manipulados durante a execução de um programa.

Aqui está um exemplo de como declarar e atribuir um valor a uma variável em C:

Variáveis

Tipos de dados

A linguagem C possui vários tipos de dados, como inteiros, ponto flutuante, caracteres e booleanos.

Veja como usar diferentes tipos de dados em C:

Tipos de dados

Neste exemplo, são declaradas quatro variáveis de diferentes tipos: inteiro, ponto flutuante, caractere e booleano. Cada uma delas é atribuída um valor apropriado e, em seguida, é exibida na tela através da função printf().

O resultado da execução deste programa:

tipos de dados resultado


Operadores

Os operadores são símbolos especiais utilizados para realizar operações matemáticas e lógicas.


Operadores aritméticos

Os operadores aritméticos são usados para realizar operações matemáticas básicas em C, como adição, subtração, multiplicação e divisão.

Operadores aritméticos


Operadores aritméticos

Resultado:

Operadores aritméticos resultado


Operadores relacionais

Os operadores relacionais são usados para comparar dois valores em C e produzir um valor lógico (verdadeiro(1) ou falso(0)) como resultado.

Operadores relacionais

Exemplo:

Operadores relacionais exemplo

Resultado:

Operadores relacionais resultado


Operadores lógicos

Os operadores lógicos são usados para combinar expressões booleanas em C e produzir um valor lógico (verdadeiro ou falso) como resultado.

Operadores lógicos

Exemplo:

Operadores lógicos exemplo

Resultado:

Operadores lógicos result


Operadores bit-a-bit

Os operadores bit-a-bit são usados para realizar operações bit-a-bit em C. Eles são úteis quando você precisa trabalhar com números binários diretamente.

Operadores bit-a-bit

Exemplo:

Operadores bit-a-bit exemplo

Resultado:

Operadores bit-a-bit resultado


Operadores especiais

sizeof()

O operador sizeof() é usado para descobrir o tamanho, em bytes, de uma variável ou tipo de dados em C. Ele é útil para determinar o espaço de armazenamento necessário para uma determinada variável ou estrutura.

sizeof()

sizeof()


Endereço (&) e ponteiro(*)

O operador de endereço (&) é usado para obter o endereço de uma variável em C, enquanto os ponteiros(*) são variáveis que armazenam esses endereços. Eles permitem que você acesse e altere o valor de uma variável através de seu endereço.

Endereço (&) e ponteiro(*)

Endereço (&) e ponteiro(*)


Operador Ternário

O operador ternário é um operador condicional que permite escrever expressões condicionais de maneira concisa e legível. Ele é composto por três partes: uma expressão condicional, seguida de um ponto de interrogação (?), seguida de uma expressão a ser avaliada caso a expressão condicional seja verdadeira, e um dois-pontos (:), seguido de uma expressão a ser avaliada caso a expressão condicional seja falsa. A sintaxe geral é:

Operador Ternário

Aqui está um exemplo de como usar o operador ternário em C:

Operador Ternário em C exemplo

Neste exemplo, a expressão condicional “(a > b)” é avaliada, e caso seja verdadeira, a expressão “a” é avaliada e armazenada na variável ‘maior’, caso contrário, a expressão “b” é avaliada e armazenada na variável ‘maior’.

O operador ternário é uma maneira concisa de escrever expressões condicionais e pode ser usado para simplificar muitas estruturas de decisão condicionais comuns. Ele permite expressar de forma concisa e limpa a lógica de uma operação de condicional simples, e é bastante útil para expressar operações condicionais simples.

Operador Ternário


Estruturas de controle de fluxo

As estruturas de controle de fluxo são usadas para controlar a execução de um programa, permitindo que ele execute diferentes ações de acordo com determinadas condições.


if, if-else

A instrução “if” é uma estrutura de controle de fluxo que permite que você execute diferentes trechos de código com base em uma determinada condição. A sintaxe geral é:

if, if-else

Você pode incluir uma instrução “else” opcional para especificar o código a ser executado se a condição for falsa:

if, if-else

Aqui está um exemplo de como usar a instrução “if” em C:

if, if-else

Neste exemplo, a condição “idade <18” é avaliada, e se for verdadeira, o código dentro do primeiro bloco de chaves é executado e imprime “Você é menor de idade.”, senão, o código dentro do segundo bloco é executado e imprime “Você é maior de idade.”

Além disso, você pode adicionar mais de um “if” e “else” para criar múltiplas condições ou incluir uma estrutura “else if” para adicionar mais condições e evitar a necessidade de aninhar vários ifs.

if, if-else

switch

A instrução “switch” é uma estrutura de controle de fluxo que permite que você execute diferentes trechos de código com base em um valor de expressão. A sintaxe geral é:

switch

expressão é avaliada e comparada com cada um dos valores “case”. Quando um valor é encontrado que é igual à expressão, o código dentro do bloco correspondente é executado. A palavra-chave “break” é usada para sair do bloco e continuar a execução do código após o switch.

Se nenhum dos valores “case” for igual à expressão, o código dentro do bloco “default” será executado, se houver. Se não houver um bloco “default”, o código após o switch será executado sem entrar em nenhum dos case.

Aqui está um exemplo de como usar a instrução “switch” em C:

switch

Neste exemplo, a expressão “opcao” é avaliada e comparada com cada um dos valores “case”. Se a expressão for igual a ‘A’, ‘B’, ou ‘C’, a mensagem de “Opção A escolhida.”, “Opção B escolhida.”, ou “Opção C escolhida.” será impressa respectivamente. Se não for igual a nenhum dos valores acima, “Opção inválida.” será impressa.



for

A instrução “for” é uma estrutura de controle de fluxo que permite que você execute um trecho de código repetidamente enquanto uma determinada condição for verdadeira. A sintaxe geral é:

for

A inicialização é executada uma vez no início do loop, a condição é verificada antes de cada iteração, e o incremento é executado após cada iteração. Se a condição for verdadeira, o código dentro do bloco será executado. Se a condição for falsa, o loop é interrompido e a execução continua após o loop.

Aqui está um exemplo de como usar a instrução “for” em C:

for

Neste exemplo, a variável “i” é inicializada com o valor 0, a condição “i < 10” é verificada antes de cada iteração, e o incremento “i++” é executado após cada iteração. O código dentro do loop imprime o valor de “i” em cada iteração, e o loop é executado 10 vezes, até que a condição “i < 10” se torne falsa.

for

while

A instrução “while” é uma estrutura de controle de fluxo que permite que você execute um trecho de código repetidamente enquanto uma determinada condição for verdadeira. A sintaxe geral é:

while

A condição é verificada antes de cada iteração. Se a condição for verdadeira, o código dentro do bloco será executado. Se a condição for falsa, o loop é interrompido e a execução continua após o loop.

Aqui está um exemplo de como usar a instrução “while” em C:

while

Neste exemplo, a variável “i” é inicializada com o valor 0, e a condição “i < 10” é verificada antes de cada iteração. O código dentro do loop imprime o valor de “i” em cada iteração, e o incremento “i++” é executado após cada iteração, e o loop é executado 10 vezes, até que a condição “i < 10” se torne falsa.

while

do-while

A instrução “do-while” é uma estrutura de controle de fluxo semelhante à instrução “while”, mas com uma diferença importante: o código dentro do loop é executado pelo menos uma vez, independentemente da condição. A sintaxe geral é:

do-while

A condição é verificada após cada iteração. Se a condição for verdadeira, o código dentro do bloco será executado novamente. Se a condição for falsa, o loop é interrompido e a execução continua após o loop.

Aqui está um exemplo de como usar a instrução “do-while” em C:

do-while

Neste exemplo, a variável “i” é inicializada com o valor 0, e o código dentro do loop imprime o valor de “i” em cada iteração, e o incremento “i++” é executado após cada iteração. A condição “i < 10” é verificada após cada iteração e o loop é executado até 10 vezes, até que a condição se torne falsa.

A nota que é importante que a variável “i” seja atualizada dentro do loop, para que ele não execute infinitamente.

O laço “do-while” é útil para situações onde você precisa garantir que o código dentro do loop seja executado pelo menos uma vez, independentemente da condição.




Funções

As funções são blocos de código que podem ser reutilizados em um programa. Elas permitem que o código seja dividido em partes menores e mais fáceis de entender e manter.

Exemplo:

Funções

Neste exemplo, é criada uma função chamada “soma” que recebe dois inteiros como argumentos e retorna um inteiro. A função “soma” é definida logo abaixo da declaração da função. Ela realiza a soma dos dois argumentos e retorna o resultado.

Na função main(), as variáveis “x” e “y” são declaradas e atribuídas os valores 5 e 2, respectivamente. Em seguida, a função “soma” é chamada com os argumentos “x” e “y” e o resultado é armazenado na variável “resultado”. Por fim, o resultado da soma é exibido na tela através da função printf().

O resultado da execução deste programa seria: “5 + 2 = 7”

Funções


Vetores e matrizes

Os vetores são conjuntos de dados do mesmo tipo armazenados em sequência em memória. As matrizes são vetores multidimensionais que permitem armazenar mais de um valor em cada posição.

Exemplo:

Vetores e matrizes

Neste exemplo, um vetor de inteiros com 10 elementos é declarado e inicializado com valores. Em seguida, um loop “for” é usado para exibir o conteúdo do vetor na tela.

Também é declarada uma matriz de inteiros com 3 linhas e 2 colunas e inicializada com valores. Em seguida, um loop aninhado é usado para exibir o conteúdo da matriz na tela.

O resultado da execução deste programa seria: “Conteúdo do vetor: 1 2 3 4 5 6 7 8 9 10 Conteúdo da matriz: 1 2 3 4 5 6”

Vetores e matrizes


Ponteiros

Os ponteiros são variáveis que armazenam endereços de memória de outras variáveis. Eles são amplamente utilizados em C para acessar e manipular dados em memória de maneira mais eficiente.

Exemplo:

Ponteiros

Neste exemplo, é declarada uma variável inteira chamada “x” e atribuído o valor 5. Em seguida, é declarado um ponteiro para um inteiro chamado “p” e atribuído o endereço de memória de “x”.

O valor de “x” e o endereço de memória de “x” são exibidos na tela através da função printf(). Em seguida, o valor apontado pelo ponteiro “p” e o endereço de memória armazenado em “p” são exibidos na tela.

O valor apontado pelo ponteiro “p” é então modificado para 10 e o novo valor de “x” é exibido na tela.

O resultado da execução deste programa seria: “x = 5 Endereço de x: 0x7ffc7a70a260 *p = 5 Endereço armazenado em p: 0x7ffc7a70a260 Novo valor de x: 10”

Ponteiros


Structs

As “structs” (estruturas) são uma forma de agrupar diferentes tipos de dados em um único bloco de memória. Elas são muito úteis quando precisamos armazenar e gerenciar informações complexas, como registros de banco de dados ou informações de usuários em um sistema.

Por exemplo, imagine que você precise armazenar informações de um conjunto de pessoas, como nome, idade e sexo. Em vez de criar três variáveis diferentes para cada pessoa, você pode criar uma struct chamada “Pessoa” com esses campos e armazenar todas as informações em uma única variável do tipo “Pessoa”.

A sintaxe para criar uma struct em C é a seguinte:

Structs

Exemplo:

Structs

Structs


Strings

Em C, uma string é uma sequência de caracteres. Ela é representada por um vetor de caracteres, onde o último elemento é um caractere nulo (‘\0’).

Por exemplo, a string “Olá, mundo!” pode ser representada como um vetor de caracteres da seguinte forma:

Strings

Para trabalhar com strings em C, existem várias funções disponíveis na biblioteca “string.h”. Algumas das funções mais comuns são:

Aqui está um exemplo de como usar algumas dessas funções:

Strings

Exemplo: Converter uma string para maiúsculas ou minúsculas:

Strings

Strings


Constantes

Em C, as constantes são valores que não podem ser modificados durante a execução do programa. Elas são declaradas com a palavra-chave “const” e podem ser do tipo inteiro, flutuante, caractere ou string.

Aqui estão alguns exemplos de como usar constantes em C:

Declarar uma constante inteira:

Constantes

Declarar uma constante flutuante:

Constantes


Modificadores de tipo

Os modificadores de tipo são palavras-chave usadas para modificar o tipo de uma variável ou função em C. Eles permitem especificar propriedades adicionais do tipo, como o tamanho ou o escopo de uma variável.

Os modificadores de tipo mais comuns em C são:

Aqui estão alguns exemplos de como usar modificadores de tipo em C:

Modificadores de tipo


Modificadores de Armazenamento

Os modificadores de armazenamento são palavras-chave usadas para controlar a maneira como as variáveis são armazenadas em memória em C. Eles permitem especificar o escopo e a duração de uma variável, além de sua visibilidade em relação a outras partes do código.

Os modificadores de armazenamento mais comuns em C são:

Modificadores de Armazenamento Modificadores de Armazenamento Modificadores de Armazenamento Modificadores de Armazenamento


Diretivas de pré-compilação

As diretivas de pré-compilação são instruções especiais inseridas no código-fonte de um programa em C processadas pelo pré-processador antes da compilação propriamente dita. Elas são usadas para incluir arquivos de cabeçalho, definir constantes e macros, e controlar a inclusão ou exclusão de trechos de código baseados em condições pré-definidas.

As diretivas de pré-compilação são identificadas pelo símbolo “#” no início da linha. Algumas das diretivas mais comuns são:

Diretivas de pré-compilação

“#define”: define uma constante ou macro. Por exemplo:

Diretivas de pré-compilação

“#ifdef”/”#ifndef”: controla a inclusão de trechos de código baseados em se uma determinada constante ou macro foi definida. Por exemplo:

Diretivas de pré-compilação

“#if”/”#elif”/”#else”: controla a inclusão de trechos de código baseados em expressões de teste. Por exemplo:

Diretivas de pré-compilação


Compilador GCC

O GCC (GNU Compiler Collection) é uma ferramenta de linha de comando que permite compilar código-fonte escrito na linguagem C. Você pode usá-lo para compilar arquivos “.c” e transformá-los em arquivos executáveis.


Compilando um código em linguagem C com o GCC

Aqui está como você pode usar o GCC para compilar um arquivo de código fonte C:

  1. Abra o terminal no seu computador.
  2. Navegue até o diretório onde o arquivo de código fonte está localizado. Você pode usar os comandos “cd” e “ls” para navegar pelos diretórios e ver os arquivos disponíveis.
  3. Digite o comando “gcc nome_do_arquivo.c -o nome_do_executavel” e pressione enter para compilar o código. Isso vai criar um arquivo executável com o nome especificado após o -o
  4. Para rodar o código basta digitar ./nome_do_executavel e pressionar enter.

Exemplo:

Compilador GCC

Compila o arquivo “program.c” e cria um arquivo executável chamado “program”:

Compilador GCC

Executa o arquivo criado anteriormente.

Além disso, existem algumas opções adicionais que você pode passar para o GCC para controlar a forma como o código é compilado, como -g (para habilitar informações de depuração), -O (para habilitar otimizações de código) e -Wall (para habilitar mensagens de aviso adicionais). Para mais detalhes acesse:




Criando bibliotecas em linguagem C

Para criar uma biblioteca em C, você precisa criar um ou mais arquivos de cabeçalho (.h) que contenham as declarações de função e estruturas de dados que você quer expor para outros programas, e um ou mais arquivos de implementação (.c) que contenham a implementação dessas funções.

Aqui está um exemplo de como criar uma biblioteca simples que expõe uma função para calcular o fatorial de um número inteiro:

Arquivo de cabeçalho (biblioteca.h):

Criando bibliotecas em linguagem C

Arquivo de implementação (biblioteca.c):

Criando bibliotecas em linguagem C

Para usar essa biblioteca em outro programa, basta incluir o arquivo de cabeçalho e linkar o arquivo de implementação durante a compilação. Por exemplo:

Criando bibliotecas em linguagem C

Para compilar esse programa, você pode usar o seguinte comando:

Criando bibliotecas em linguagem C

Observação

Para evitar que uma biblioteca em C seja incluída mais de uma vez durante a compilação, você pode usar uma diretiva de pré-processador especial chamada “pragma once”. Essa diretiva indica ao pré-processador do compilador que a biblioteca só deve ser incluída uma vez, independentemente de quantas vezes ela é referenciada no código-fonte.

Para usar a diretiva “pragma once”, basta adicioná-la no início do seu arquivo de cabeçalho (.h). Por exemplo:

pragma once

Outra opção é usar a diretiva “define” para definir uma macro específica no início do seu arquivo de cabeçalho e, em seguida, verificar se essa macro já foi definida antes de incluir o código da biblioteca. Por exemplo:

define

Essa abordagem é um pouco mais verbosa, mas pode ser útil em casos em que você quer controlar a inclusão da biblioteca de maneira mais explícita.