<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Linguagem C - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Linguagem C - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 19:37:34 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/linguagem-c/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Tipos de dados estruturados em C explicados ]]>
                </title>
                <description>
                    <![CDATA[ ‌  Existem variáveis de diferentes tipos na linguagem C, como os ints, chars e  floats. Todos permitem o armazenamento de dados. Também temos os arrays, que permitem o agrupamento de itens de dados que possuem o mesmo tipo. Porém, na realidade, nem sempre vamos ter o luxo de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/</link>
                <guid isPermaLink="false">655413e4f2994303ed34352d</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nathalia Nóbrega ]]>
                </dc:creator>
                <pubDate>Sun, 19 May 2024 23:14:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/structured-data-types-in-c-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Structured Data Types in C Explained</a>
      </p><p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </p><p>Existem variáveis de diferentes tipos na linguagem C, como os <code>int</code>s, <code>char</code>s e <code>float</code>s. Todos permitem o armazenamento de dados.</p><p>Também temos os <em>arrays</em>, que permitem o agrupamento de itens de dados que possuem o mesmo tipo.</p><p>Porém, na realidade, nem sempre vamos ter o luxo de possuir dados de apenas um tipo. É nesse cenário que utilizamos as <strong>estruturas. </strong>Neste artigo, vamos aprender mais sobre tipos de dados estruturados em C.</p><h2 id="-ndice">Índice</h2><p><strong>A. <a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#fundamentos">Fundamentos</a></strong></p><ol><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\31%20-defini-o-e-declara-o">Definição e declaração</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\32%20-inicializa-o-e-acesso-aos-membros-de-uma-estrutura">Inicialização e acesso aos membros de uma estrutura</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\33%20-opera-es-com-a-vari-vel-de-estrutura">Operações com uma variável de estrutura</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\34%20-array-de-uma-estrutura">Array de uma estrutura</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\35%20-estruturas-aninhadas">Estruturas aninhadas</a></li></ol><p><strong>B. <a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#aloca-o-de-mem-ria">Alocação de memória</a></strong></p><ol><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\31%20-alinhamento-de-dados">Alinhamento de dados</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\32%20-preenchimento-de-estruturas">Preenchimento de estruturas</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\33%20-alinhamento-de-membro-de-estrutura">Alinhamento de membro de estrutura</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\34%20-empacotamento-de-estrutura">Empacotamento de estrutura</a></li></ol><p><strong>C. <a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#ponteiros">Ponteiros</a></strong></p><ol><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\31%20-ponteiro-como-um-membro">Ponteiro como um membro</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\32%20-ponteiro-para-estrutura">Ponteiro para estrutura</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\33%20-ponteiro-e-array-de-estrutura">Ponteiro e array de estrutura</a></li></ol><p><strong>D. <a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#fun-es">Funções</a></strong></p><ol><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\31%20-fun-o-como-membro">Função como membro</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\32%20-estrutura-como-argumento-de-fun-o">Estrutura como argumento de função</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#\33%20-estrutura-como-retorno-de-fun-o">Estrutura como retorno de uma função</a></li></ol><p><strong>E. <a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#estrutura-autorreferencial">Estrutura autorreferencial</a></strong></p><p><strong>F. <a href="https://www.freecodecamp.org/portuguese/news/tipos-de-dados-estruturados-em-c-explicados/#conclus-o">Conclusão</a></strong></p><p>Vamos começar!</p><h2 id="fundamentos">Fundamentos</h2><h3 id="1-defini-o-e-declara-o">1. Definição e declaração</h3><p>Uma estrutura é uma <strong>coleção </strong>de uma ou mais variáveis, possivelmente de tipos distintos, agrupadas em um nome comum. É um tipo de dado <strong>definido pelo usuário</strong>.</p><p>As estruturas auxiliam na organização de dados complicados em programas grandes, já que permitem com que um grupo de variáveis logicamente associadas entre si sejam tratadas desse modo.</p><p>Por exemplo, um estudante pode ter as propriedades nome, idade, sexo e notas. Podemos criar um array do tipo <code>char</code> para a variável <code>nome</code>, um <code>int</code> para <code>matrícula</code>, um <code>char</code> para <code>sexo</code> e um array do tipo <code>int</code> para as <code>notas</code>.</p><p>Porém, se existem 20 ou 100 estudantes, vai ser difícil lidar com essas variáveis.</p><p>Podemos declarar uma estrutura utilizando a palavra reservada <code>struct</code> de acordo com a sintaxe abaixo:</p><pre><code class="language-c"> /* Sintaxe */
 struct nomeEstrutura
        {
            tipoDado variavelMembro1;
            tipoDado variavelMembro2;
            ...
        };

 /* Exemplo */
struct estudante
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
    };
</code></pre><p>O código acima define um novo tipo de dado, <code>struct estudante</code>. Cada variável pertencente a esse tipo de dado vai possuir um <code>nome[20]</code>, <code>matricula</code>, <code>sexo</code> e <code>notas[5]</code>. Essas propriedades citadas são os <strong>membros</strong> da estrutura.</p><p>Uma vez que a estrutura é declarada como um novo tipo de dado, podemos criar as variáveis que possuem o tipo dessa estrutura.</p><pre><code class="language-c"> /* Declaração de variável */
struct nomeEstrutura variavelEstrutura;

 /* Exemplo /*
struct estudante est1;
struct estudante est2,est3,est4;</code></pre><p>Cada variável de <code>struct estudante</code> tem sua própria cópia das propriedades membro.</p><p><strong>Algumas informações importantes:</strong></p><ol><li>Os membros da estrutura não ocupam memória alguma até que uma variável de estrutura seja criada.</li><li>Você já deve ter notado que estamos usando a palavra <code>struct</code> para declarar a variável também. Não é um pouco tedioso? </li></ol><p>Se utilizarmos a palavra reservada <code>typedef</code> na declaração da estrutura, podemos evitar a repetição da palavra <code>struct</code>. </p><pre><code class="language-c">typedef struct estudantes
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
    } ESTUDANTE; 

/* ou */
typedef struct
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
    } ESTUDANTE; 


ESTUDANTE est1,est2,est3,est4;
</code></pre><p>Como convenção, são utilizadas letras <strong>maiúsculas</strong> para definição de tipos (como <code>ESTUDANTE</code>).</p><p>3. A definição de estrutura e declaração de variável podem ser combinadas desta maneira: </p><pre><code class="language-c">struct estudante
    {
        char nome[20];
        int matricula;
        chat sexo;
        int notas[5];
    }est1, est2, est3, est4;
</code></pre><p>4. O uso de <code>nomeEstrutura</code> para declarar a estrutura é opcional. O código abaixo, por exemplo, é totalmente válido.</p><pre><code class="language-c">struct
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
    }est1, est2, est3, est4;
</code></pre><p>5. &nbsp;Estruturas geralmente são declaradas no começo do arquivo do código-fonte, antes mesmo das definições das funções (você já vai ver o motivo).</p><p>6. &nbsp;A linguagem C não permite a inicialização de uma variável dentro da declaração de uma estrutura.</p><h3 id="2-inicializa-o-e-acesso-aos-membros-de-uma-estrutura">2. Inicialização e acesso aos membros de uma estrutura</h3><p>Como qualquer outra variável, uma variável de estrutura também pode ser inicializada na mesma linha onde foi declarada.</p><pre><code class="language-c"> /* Inicialização de variável */
nomeEstrutura nomeVariavel = { valor1, valor2,...};

 /* Exemplo */
typedef struct
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
    }ESTUDANTE;

void main(){
ESTUDANTE est1 = { "Alex", 43, 'M', {76, 78, 56, 98, 92}};
ESTUDANTE est2 = { "Max", 33, 'M', {87, 84, 82, 96, 78}};
}
</code></pre><p>Para acessar os membros, precisamos usar o <code>.</code> (<strong>operador de ponto</strong>)</p><pre><code class="language-c"> /* Acessando os membros de uma estrutura */
variavelEstrutura.membroVariavel;

/* Exemplo */
 printf("Nome: %s\n", est1.nome);
 printf("Matricula: %d\n", est1.matricula);
 printf("Sexo: %c\n", est1.sexo);
 for( int i = 0; i &lt; 5; i++)
   printf("Notas na matéria n°%d: %d\n", i, est1.notas[i]);

/* Saída */
Nome: Alex
Matricula: 43
Sexo: M
Notas na matéria n°0: 73
Notas na matéria n°1: 78
Notas na matéria n°2: 56
Notas na matéria n°3: 89
Notas na matéria n°4: 92
</code></pre><p>Os membros podem ser inicializados na declaração da variável em qualquer ordem, apenas utilizando o <code>.</code>.</p><pre><code class="language-c">ESTUDANTE est3 = { .sexo = 'M', .matricula = 23, .nome = "Gasly", .notas = { 99, 45, 67, 78, 94}};
</code></pre><p>Também podemos inicializar os primeiros membros e deixar os membros restantes vazios. Contudo, os membros que não foram inicializados devem estar <strong>somente </strong>no final da lista.</p><p>Inteiros e números de ponto flutuante que não foram inicializados tem um valor padrão <code>0</code>. Enquanto que caracteres e <em>strings </em>não inicializados possuem o valor padrão <code>\0</code> (NULL) .</p><pre><code class="language-c">ESTUDANTE est4 = { "Mário", 65};
 /* Equivalente a { "Mario", 65, '\0', { 0, 0, 0, 0, 0} } */
</code></pre><h3 id="3-opera-es-com-a-vari-vel-de-estrutura">3. Operações com a variável de estrutura</h3><p>Ao contrário das variáveis de tipos primitivos, não podemos utilizar operadores aritméticos como <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code> para variáveis de estrutura. Também não é possível o uso de operadores relacionais e de igualdade.</p><p>Contudo, podemos copiar uma variável de estrutura para outra, desde que pertençam à mesma estrutura.</p><pre><code class="language-c"> /* Operações inválidas */
est1 + est2
est1 - est2
est1 == est2
est1 != est2

 /* Operação válida */
est1 = est2
</code></pre><p>Para comparar as variáveis de estrutura, vamos comparar os membros de cada uma individualmente.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

 struct estudante
    {
        char nome[20];
        double matricula;
        char sexo;
        int notas[5];
    }est1,est2;


void main()
{
    struct estudante est1= { "Alex", 43, 'M', {76, 78, 56, 98, 92}};
    struct estudante est2 = { "Max", 33, 'M', {87, 84, 82, 96, 78}};

    if( strcmp(est1.nome,est2.nome) == 0 &amp;&amp; est1.matricula == est2.matricula)
        printf("Os dois dados pertencem ao mesmo estudante.\n");
    else printf("Dados diferentes, estudantes diferentes.\n");

     /* Copiando a variável de estrutura */
    est2 = est1;

    if( strcmp(est1.name,est2.name) == 0 &amp;&amp; est1.matricula == est2.matricula)
        printf("Os dois dados pertencem ao mesmo estudante.\n");
    else printf("Dados diferentes, estudantes diferentes.\n");
}

 /* Saida */
Os dois dados pertencem ao mesmo estudante.

Dados diferentes, estudantes diferentes.

</code></pre><h3 id="4-array-de-uma-estrutura">4. Array de uma estrutura</h3><p>Você deve ter percebido que criamos 4 variáveis diferentes do tipo <code>struct student</code> para armazenar os dados de 4 estudantes.</p><p>Uma maneira melhor de armazenar esses dados seria criar um array de <code>struct student</code> (da mesma maneira que um array de <code>int</code>s )</p><pre><code class="language-c">struct estudante
    {
        char nome[20];
        double matricula;
        char sexo;
        int notas[5];
    };

struct estudante estu[4];
</code></pre><p>Para acessar os elementos do array <code>estu</code> e os membros de cada elemento, podemos utilizar laços de repetição (<em>loops</em>).</p><pre><code class="language-c"> /* Registrando valores para os estudantes */

for(int i = 0; i &lt; 4; i++)
    {
        printf("Digite o nome:\n");
        scanf("%s",&amp;estu[i].nome);
        printf("Digite a matrícula:\n");
        scanf("%d",&amp;estu[i].matricula);
        printf("Digite o sexo:\n");
        scanf(" %c",&amp;estu[i].sexo);

        for( int j = 0; j &lt; 5; j++)
        {
            printf("Digite as notas da matéria n°%d:\n",j);
            scanf("%d",&amp;estu[i].notas[j]);
        }

        printf("\n-------------------\n\n");
    }

 /* Calculando a média de notas e imprimindo o resultado */

for(int i = 0; i &lt; 4; i++)
    {
        float soma = 0;
        for( int j = 0; j &lt; 5; j++)
        {
            soma += estu[i].notas[j];
        }

        printf("Nome: %s\nMédia = %.2f\n\n", estu[i].nome,soma/5);
    }
</code></pre><h3 id="5-estruturas-aninhadas">5. Estruturas aninhadas</h3><p>Aninhar uma estrutura significa ter uma ou mais variáveis de estrutura dentro de uma outra estrutura. Do mesmo modo com que declaramos um membro do tipo <code>int</code> ou um membro do tipo <code>char</code>, podemos também declarar uma variável de estrutura como um membro.</p><pre><code class="language-c">struct nascimento
    {
       int dia;
       int mes;
       int ano;
    };

struct estudante
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
        struct nascimento dataNascimento;
    };

void main(){
 struct estudante estu1;
</code></pre><p>A variável de estrutura <code>dataNascimento</code> de tipo <code>struct nascimento</code> está aninhada dentro de <code>struct estudante</code>. É importante frisar que você <strong>não</strong> consegue aninhar uma variável de estrutura do tipo <code>struct estudante</code> dentro de <code>struct estudante</code>.</p><p>Perceba que a estrutura que vai ser aninhada deve ser declarada antes. Usando o <code>.</code>, podemos acessar os membros contidos dentro da estrutura interna, assim como os outros membros.</p><pre><code class="language-c"> /* Exemplo */
estu1.dataNascimento.dia
estu1.dataNascimento.mes
estu1.dataNascimento.ano
estu1.nome
</code></pre><p>Variáveis de estrutura de diferentes tipos podem ser aninhadas.</p><pre><code class="language-c">struct nascimento
    {
       int dia;
       int mes;
       int ano;
    };
 
struct parentesco
    {
        char nomePai[20];
        char nomeMae[20];
    };

struct estudante
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
        struct nascimento dataNascimento;
        struct parentesco pais;
    };
</code></pre><h2 id="aloca-o-de-mem-ria">Alocação de memória</h2><p>Quando uma variável de estrutura de um certo tipo é declarada, os membros da estrutura são alocados em memória de maneira contígua (adjacente). </p><pre><code class="language-c">struct estudante
    {
        char nome[20];
        int matricula;
        char sexo;
        int notas[5];
    } estu1;
</code></pre><p>Aqui, haverá memória sendo alocada para <code>nome[20</code>, seguido de <code>matricula</code>, <code>sexo</code>, e <code>notas[5]</code>. Isso implica que o tamanho de <code>estu1</code> ou de <code>struct estudante</code> será a soma do tamanho dos membros, certo? Vamos dar uma olhada.</p><pre><code class="language-c">void main()
{
    printf("Soma do tamanho dos membros = %I64d bytes\n", sizeof(estu1.nome) + sizeof(estu1.matricula) + sizeof(estu1.sexo) + sizeof(estu1.notas));
    printf("Usando o operador sizeof() = %I64d bytes\n",sizeof(estu1));
}

 /* Saída */
Soma do tamanho dos membros =  45 bytes
Usando o operador sizeof() = 48 bytes
</code></pre><blockquote>Já que o operador <code>sizeof()</code> retorna um <code>long long unsigned int</code>, utilize <code>%I64D</code> para especificar o formato. Você talvez precise usar <code>%llu</code> ou <code>lld</code>, dependendo do seu compilador.</blockquote><blockquote>Usar <code>%d</code> retornará um aviso - &nbsp;format '%d' expects argument of type 'int', but argument 2 has type 'long long unsigned int'. (<strong>formato '%d' pede um argumento do tipo 'int', mas o argumento 2 tem tipo 'long long unsigned int'</strong>).</blockquote><p>Utilizando o operador <code>sizeof()</code> na variável de estrutura, tivemos 3 bytes a mais do que a soma do tamanho dos membros. Por que? Onde estão esses 3 bytes na memória? </p><p>Vamos responder à segunda pergunta primeiro. Podemos imprimir os endereços de memória dos membros para achar estes 3 bytes.</p><pre><code class="language-c">void main()
{
    printf("Endereço do membro 'nome' = %d\n", &amp;estu1.nome);
    printf("Endereço do membro 'matricula' = %d\n", &amp;estu1.matricula);
    printf("Endereço do membro 'sexo' = %d\n", &amp;estu1.sexo);
    printf("Endereço do membro 'notas' = %d\n", &amp;estu1.notas);
}

 /* Saída */
Endereço do membro 'nome' = 4225408
Endereço do membro 'matricula' = 4225428
Endereço do membro 'sexo' = 4225432
Endereço do membro 'notas' = 4225436
</code></pre><p>Podemos ver que o array <code>notas[5]</code>, ao invés de estar sendo alocado no endereço <code>4225433</code>, está no endereço <code>4224536</code>. Por que isso ocorre?</p><h3 id="1-alinhamento-de-dados">1. Alinhamento de dados</h3><p>Antes de darmos uma olhada no alinhamento de dados, é importante entender como o processador lê dados da memória.</p><p>Um processador lê <strong>uma palavra</strong> em um ciclo. Essa palavra possui <strong>4 bytes</strong> para um processador de <strong>32 bits </strong>e <strong>8 bytes</strong> para um de <strong>64 bits</strong>. Quanto menor o número de ciclos, melhor o desempenho da CPU.</p><p>Um modo de alcançar um menor número de ciclos é por meio do <strong>alinhamento </strong>de dados. Na prática, alinhar é quando uma <em>variável de tamanho <code>t</code> de um tipo primitivo qualquer é armazenada em um endereço que é múltiplo de </em><code><em>t</em></code><em>. &nbsp;</em>Esse processo ocorre por padrão.</p><p><strong>Endereços alinhados para certos tipos de dados</strong></p><!--kg-card-begin: html--><table>
    <tbody><tr>
        <th> Tipos de dados </th>
        <th> Tamanho (em bytes)</th>
        <th> Endereço </th>
    </tr>
    <tr>
        <td>char</td>
        <td>1</td>
        <td>múltiplo de 1</td>
    </tr>
    <tr>
        <td>short</td>
        <td>2</td>
        <td>múltiplo de 2</td>
    </tr>
    <tr>
        <td>int, float</td>
        <td>4</td>
        <td>múltiplo de 4</td>
    </tr>
    <tr>
        <td>double, long, * (ponteiros)</td>
        <td>8</td>
        <td>múltiplo de 8</td>
    </tr>
    <tr>
        <td>long double</td>
        <td>16</td>
        <td>múltiplo de 16</td>
    </tr>
</tbody></table><!--kg-card-end: html--><h3 id="2-preenchimento-de-estruturas">2. Preenchimento de estruturas</h3><p>Talvez você precise inserir alguns bytes extras entre os membros da estrutura para poder alinhar dados. Esses bytes extras são conhecidos como <strong>preenchimento (<em>padding</em>).</strong></p><p>No código acima, os 3 bytes acrescentados foram o preenchimento. Sem este preenchimento, <code>notas[0]</code>, que é de tipo <code>int</code> (endereço múltiplo de 4), teria seu endereço como <code>4225433</code> (não múltiplo de 4).</p><p>Você provavelmente já deve ter percebido por que estruturas não podem ser comparadas diretamente.</p><h3 id="3-alinhamento-de-membro-de-estrutura">3. Alinhamento de membro de estrutura</h3><p>Para explicar este tópico, vamos para outro exemplo (você vai entender o por quê).</p><pre><code class="language-c">struct exemplo
    {
        int i1;
        double d1;
        char c1;
        
    } exemplo1;

void main()
{
    printf("tamanho = %I64d bytes\n",sizeof(exemplo1));
}
</code></pre><p>Qual seria a saída desse programa? Vamos aplicar nossos conhecimentos.</p><p><code>i1</code> possui 4 bytes. Essa variável vai ser seguida de um preenchimento de 4 bytes porque o endereço de <code>d1</code> deve ser divisível por 8.</p><p>Isso será seguido de 8 e 1 byte respectivamente para <code>d1</code> e <code>c1</code>. Logo, a saída deve ser 4 + 4 + 8 + 1 = 17 bytes.</p><pre><code class="language-c"> /* Saída */
tamanho = 24 bytes
</code></pre><p>O quê?! Errado de novo! Por quê? Através de um array de tipo <code>struct exemplo</code>, podemos entender melhor. Também vamos imprimir o endereço dos membros de <code>exemplo2[0]</code>.</p><pre><code class="language-c">void main()
{
    struct exemplo exemplo2[2];
    printf("Endereço de exemplo2[0].i1 = %d\n", &amp;exemplo2[0].i1);
    printf("Endereço de exemplo2[0].d1 = %d\n", &amp;exemplo2[0].d1);
    printf("Endereço de exemplo2[0].c1 = %d\n", &amp;exemplo2[0].c1);

}

 /* Saída */
Endereço de exemplo2[0].i1 = 4225408
Endereço de exemplo2[0].d1= 4225416
Endereço de exemplo2[0].c1 = 4225424
</code></pre><p>Vamos supor que o tamanho de <code>exemplo2[0]</code> é 17 bytes. Isso implica que o endereço de <code>exemplo2[1].i1</code> será <code>4225425</code>. Isso <strong>não é</strong> possível já que o endereço de um <code>int</code> deve ser múltiplo de 4.</p><p>Logicamente, um endereço possível para <code>exemplo2[1].i1</code> pode ser <code>4225428</code>, um múltiplo de 4.</p><p>Isso também está errado. Você sabe o por quê? O endereço de <code>exemplo2[1].d1</code> agora será (28 + 4 (<code>i1</code>) + 3 (preenchimento)) <code>4225436</code>, que não é um múltiplo de 8.</p><p>Para que possamos evitar o desalinhamento, o compilador aplica alinhamento em toda estrutura. Isso é feito ao adicionar bytes extra após o último membro, processo conhecido como <strong>alinhamento de membro de estrutura.</strong></p><p>No exemplo que discutimos no começo desta seção, isso não era necessário (por isso, precisamos de outro exemplo.)</p><p>Uma maneira simples de lembrar deste conceito é por meio desta regra: o endereço e tamanho da estrutura devem ser múltiplos de <code>t_max</code>, onde <code>t_max</code> é o tamanho máximo que um membro da estrutura ocupa.</p><p>No caso de <code>struct exemplo</code>, 8 bytes é o tamanho máximo de <code>d1</code>. Portanto, haverá um preenchimento de 7 bytes no fim da estrutura, fazendo com que seu tamanho seja de 24 bytes.</p><p><strong>Seguindo as duas regras abaixo, você pode facilmente encontrar o tamanho de qualquer estrutura:</strong></p><ol><li>Todo tipo de dado armazena seu valor em um endereço que é múltiplo de seu tamanho.</li><li>Toda estrutura ocupa um tamanho que é múltiplo do tamanho máximo de bytes que um membro ocupa.</li></ol><p>Apesar de sermos capazes de diminuir os ciclos de uma CPU, existe uma quantidade significativa de memória que será desperdiçada.</p><p>Uma maneira de diminuir a quantidade de preenchimento para o mínimo possível é declarando os membros em ordem decrescente de tamanho.</p><p>Se aplicarmos este método em <code>struct exemplo</code>, o tamanho da estrutura é reduzido para 16 bytes. O preenchimento é reduzido de 7 para 3 bytes.</p><pre><code class="language-c">struct exemplo
    {
        double d1; 
        int i1;
        char c1;
        
    } exemplo3;

void main()
{
    printf("tamanho = %I64d bytes\n",sizeof(exemplo3));
}

 /* Saída */
tamanho = 16 bytes
</code></pre><h3 id="4-empacotamento-de-estrutura">4. Empacotamento de estrutura </h3><p>Empacotar (<em>packing</em>) é o oposto de preencher. Empacotar previne o compilador de preencher e remove a memória não alocada.</p><p>No caso do Windows, podemos usar a diretiva <code>#pragma pack</code>, que especifica o empacotamento de membros de estrutura.</p><pre><code class="language-c">#pragma pack(1)

struct exemplo
    {
        double d1; 
        int i1;
        char c1;
        
    } exemplo4;

void main()
{
    printf("tamanho = %I64d bytes\n",sizeof(exemplo4));
}

 /* Saída */
tamanho = 13 bytes
</code></pre><p>Isso garante que os membros da estrutura estejam <em>alinhados</em> em um limite de 1 byte. Em outras palavras, o endereço de qualquer tipo de dado deve ser um múltiplo ou de 1 byte ou do seu tamanho (depende de qual for o menor).</p><h2 id="ponteiros">Ponteiros</h2><blockquote>Se quiser repassar o conteúdo sobre ponteiros antes de seguir em frente com o artigo, aqui está um <a href="https://www.freecodecamp.org/news/pointers-in-c-are-not-as-difficult-as-you-think/">link</a> que cobre ponteiros de maneira aprofundada (texto em inglês).</blockquote><h3 id="1-ponteiro-como-um-membro">1. Ponteiro como um membro</h3><p>Uma estrutura pode ter ponteiros como membros.</p><pre><code class="language-c">struct estudante
    {
        char *nome;
        int *matricula;
        char sexo;
        int notas[5];
    };

void main()
{   int alexMatricula = 44;
   struct estudante estu1 = { "Alex", &amp;alexMatricula, 'M', { 76, 78, 56, 98, 92 }};
}
</code></pre><p>Utilizando o <code>.</code> (operador ponto), podemos novamente acessar os membros. Já que <code>matricula</code> agora tem o endereço de <code>alexMatricula</code>, teremos que desreferenciar <code>estu1.matricula</code> (e não <code>estu1.(*matricula)</code>) para obter o valor</p><pre><code class="language-c"> printf("Nome: %s\n", estu1.nome);
   printf("Matrícula: %d\n", *(estu1.matricula));
   printf("Sexo: %c\n", estu1.sexo);

   for( int i = 0; i &lt; 5; i++)
    printf("Notas na matéria %d: %d\n", i, estu1.notas[i]);

 /* Saída */
Nome: Alex
Matrícula: 43
Sexo: M
Notas na matéria 0: 76
Notas na matéria 1: 78
Notas na matéria 2: 56
Notas na matéria 3: 98
Notas na matéria 4: 92</code></pre><h3 id="2-ponteiro-para-estrutura">2. Ponteiro para estrutura</h3><p>Assim como ponteiros de inteiros, ponteiros de arrays e ponteiros de funções, temos ponteiros para estruturas também.</p><pre><code class="language-c">struct estudante {
    char nome[20];
    int matricula;
    char sexo;
    int notas[5];
};

struct estudante estu1 = {"Alex", 43, 'M', {76, 98, 68, 87, 93}};

struct estudante*ptrEstu1 = &amp;estu1;
</code></pre><p>Declaramos o ponteiro <code>ptrEstu1</code> do tipo <code>struct estudante</code>. Definimos o endereço de <code>estu1</code> para <code>ptrEstu1</code>.</p><p><code>ptrEstu1</code> armazena o endereço base de <code>estu1</code>, que é o endereço base do primeiro membro da estrutura. Incrementar em 1 aumentaria o endereço em <code>sizeof(estu1)</code> bytes.</p><pre><code class="language-c">printf("Endereço da estrutura = %d\n", ptrEstu1);
printf("Endereço do membro `nome` = %d\n", &amp;estu1.nome);
printf("Incrementar em 1 resulta em %d\n", ptrEstu1 + 1);

/* Saída */
Endereço da estrutura = 6421968
Endereço do membro `nome` = 6421968
Incrementar em 1 resulta em 6422016
</code></pre><p>Podemos acessar os membros de <code>estu1</code> usando <code>ptrEstu1</code> de duas formas. Usando <code>*</code> (operador de indireção) ou usando <code>-&gt;</code> (<strong>operador infix ou arrow</strong>).</p><p>Com <code>*</code>, continuaremos usando o <code>.</code> (operador ponto) enquanto que com <code>-&gt;</code> não precisaremos do operador de ponto.</p><pre><code class="language-c">printf("Nome sem usar ptrEstu1 : %s\n", estu1.nome);
printf("Nome usando ptrEstu1 e * : %s\n", (*ptrEstu1).nome);
printf("Nome usando ptrEstu1 e -&gt; : %s\n", ptrEstu1-&gt;nome);

/* Output */
Nome sem usar ptrEstu1 : Alex
Nome usando ptrEstu1 e * : Alex
Nome usando ptrEstu1 e -&gt; : Alex
</code></pre><p>De modo similar, podemos acessar e modificar outros membros também. Note que os parênteses são necessários enquanto utilizamos o <code>*</code> já que o operador de ponto (<code>.</code>) tem procedência maior que <code>*</code>.</p><h3 id="3-ponteiro-e-array-de-estrutura">3. Ponteiro e array de estrutura</h3><!--kg-card-begin: markdown--><p>Podemos criar um array do tipo <code>struct estudante</code> e usar um ponteiro para acessar os elementos e seus membros.</p>
<!--kg-card-end: markdown--><pre><code class="language-c">struct estudante estu[10];

 /* Ponteiro para o primeiro elemento (estrutura) do array */
struct estudante *ptrEstu_tipo1 = estu;

 /* Ponteiro para um array de tamanho 10 do tipo struct estudante */
struct estudante (*ptrEstu_tipo2)[10] = &amp;estu;
</code></pre><p>Note que <code>ptrEstu_tipo1</code> é um ponteiro para <code>estu[0]</code>, enquanto que <code>ptrEstu_tipo2</code> é um ponteiro para o array inteiro de tamanho 10 e tipo <code>struct estudante</code>. Adicionar 1 a <code>ptrEstu_tipo1</code> apontaria para <code>estu[1]</code>.</p><p>Podemos usar <code>ptrEstu_tipo1</code> com um laço de repetição (ou <em>loop</em>) para percorrer os elementos e seus membros.</p><pre><code class="language-c">for( int i = 0; i &lt;  10; i++)
printf("%s, %d\n", ( ptrEstu_tipo1 + i)-&gt;nome, ( ptrEstu_tipo1 + i)-&gt;matricula);
</code></pre><h2 id="fun-es">Funções</h2><h3 id="1-fun-o-como-membro">1. Função como membro</h3><p>Funções <strong>não podem</strong> ser membro de uma estrutura. Contudo, utilizando <em>ponteiros de função</em>, podemos chamar funções utilizando <code>.</code>. Apenas tenha em mente que isso não é recomendado.</p><pre><code class="language-c"> struct exemplo
    {
        int i;
        void (*ptrMensagem)(int i);


    };

void mensagem(int);

void mensagem(int i)
{
    printf("Olá, eu sou um membro de uma estrutura. Esta estrutura também tem um inteiro de valor %d", i);
}

void main()
{
    struct exemplo eg1 = {6, mensagem};
    eg1.ptrMensagem(eg1.i);
}
</code></pre><p>Declaramos dois membros, um inteiro i e um ponteiro de função <code>ptrMensagem</code> dentro de <code>struct exemplo</code>. O ponteiro de função aponta para uma função que recebe um inteiro e retorna <code>void</code>.</p><p><code>mensagem</code> é esta função. Inicializamos <code>eg1</code> com valor <code>6</code> e <code>mensagem</code>. Depois usamos <code>.</code> para chamar a função usando <code>ptrMensagem</code> e passar como valor <code>eg1.i</code>.</p><h3 id="2-estrutura-como-argumento-de-fun-o">2. Estrutura como argumento de função</h3><p>Assim como variáveis, podemos passar <strong>membros individuais de estruturas</strong> como argumentos.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

struct estudante {
    char nome[20];
    int matricula;
    char sexo;
    int notas[5];
};

void display(char a[], int b, char c, int notas[])
{
    printf("Nome: %s\n", a);
    printf("Matrícula: %d\n", b);
    printf("Sexo: %c\n", c);

    for(int i = 0; i &lt; 5; i++)
        printf("Notas na matéria %d: %d\n",i,notas[i]);
}
void main()
{
    struct estudante estu1 = {"Alex", 43, 'M', {76, 98, 68, 87, 93}};
    display(estu1.nome, estu1.matricula, estu1.sexo, estu1.notas);
}

 /* Saída */
Nome: Alex
Matrícula: 43
Sexo: M
Notas na matéria 0: 76
Notas na matéria 1: 98
Notas na matéria 2: 68
Notas na matéria 3: 87
Notas na matéria 4: 93
</code></pre><p>Note que a estrutura <code>struct estudante</code> é declarada dentro de <code>main()</code>, logo no começo. Isto é para assegurar que ela estará disponível globalmente e que <code>display()</code> possa usá-la.</p><p>Se a estrutura for definida dentro de <code>main()</code>, seu escopo estará limitado somente à <code>main()</code>.</p><p>Passar membros de estrutura como argumento não é muito eficiente quando temos um número grande deles. Então, <strong>variáveis de estrutura </strong>podem ser passadas para uma função.</p><pre><code class="language-c">void display(struct estudante a)
{
    printf("Nome: %s\n", a.nome);
    printf("Matrícula: %d\n", a.matricula);
    printf("Sexo: %c\n", a.sexo);

    for(int i = 0; i &lt; 5; i++)
        printf("Notas na matéria %d: %d\n",i,a.notas[i]);
}
void main()
{
    struct estudante estu1 = {"Alex", 43, 'M', {76, 98, 68, 87, 93}};
    display(estu1);
}
</code></pre><p>Se o tamanho da estrutura é muito grande, então passar uma cópia dela será ineficiente. Poderíamos passar um <strong>ponteiro de estrutura</strong> para uma função. Nesse caso, o endereço da estrutura será passado como um argumento de fato.</p><pre><code class="language-c">void display(struct estudante *p)
{
    printf("Nome: %s\n", p-&gt;nome);
    printf("Matrícula: %d\n", p-&gt;matricula);
    printf("Sexo: %c\n", p-&gt;sexo);

    for(int i = 0; i &lt; 5; i++)
        printf("Notas na matéria %d: %d\n",i,p-&gt;notas[i]);
}
void main()
{
    struct estudante estu1 = {"Alex", 43, 'M', {76, 98, 68, 87, 93}};
    struct estudante *ptrEstu1 = &amp;estu1;
    display(ptrEstu1);
}
</code></pre><p>Passar um <strong>array de estrutura</strong> para uma função é semelhante a passar um array de qualquer tipo a uma função. O nome do array, que é o endereço base do array da estrutura, é passado à função.</p><pre><code class="language-c">void display(struct estudante *p)
{   
    for( int j = 0; j &lt; 10; j++)
   {
       printf("Nome: %s\n", (p+j)-&gt;nome);
        printf("Matrícula: %d\n", (p+j)-&gt;matricula);
        printf("Sexo: %c\n", (p+j)-&gt;sexo);

        for(int i = 0; i &lt; 5; i++)
        printf("Notas na matéria %d: %d\n",i,(p+j)-&gt;notas[i]);
   }
}

void main()
{
    struct estudante estu1[10];
    display(estu1);
}
</code></pre><h3 id="3-estrutura-como-retorno-de-fun-o">3. Estrutura como retorno de função</h3><p>Podemos retornar uma <strong>variável de estrutura</strong>, assim como qualquer outra variável.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

struct estudante {
    char nome[20];
    int matricula;
    char sexo;
    int notas[5];
};


struct estudante incrementaEm5(struct estudante p)
{
    for( int i =0; i &lt; 5; i++)
        if(p.notas[i] + 5 &lt;= 100)
           {
               p.notas[i]+=5;
           }
    return p;
}

void main()
{
    struct estudante estu1 = {"Alex", 43, 'M', {76, 98, 68, 87, 93}};
    estu1 = incrementaEm5(estu1);
    
    printf("Nome: %s\n", estu1.nome);
    printf("Matrícula: %d\n", estu1.matricula);
    printf("Sexo: %c\n", estu1.sexo);
    
     for(int i = 0; i &lt; 5; i++)
        printf("Nota na matéria %d: %d\n",i,estu1.notas[i]);
}

 /* Saída */
Nome: Alex
Matrícula: 43
Sexo: M
Notas na matéria 0: 81
Notas na matéria 1: 98
Notas na matéria 2: 73
Notas na matéria 3: 92
Notas na matéria 4: 98
</code></pre><p>A função <code>incrementaEm5()</code> soma 5 à todas as notas de matérias que, após a soma, sejam menores ou iguais a 100. Note que o tipo de retorno é uma variável de estrutura do tipo <code>struct estudante</code>.</p><p>Enquanto retorna um <strong>membro de estrutura</strong>, o tipo de retorno deve ser o mesmo que o do membro.</p><p>Um <strong>ponteiro de estrutura</strong> também pode ser retornado por uma função.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct retangulo {
    int tamanho;
    int amplitude;
};

struct retangulo* function(int tamanho, int amplitude)
{
    struct retangulo *p  = (struct retangulo *)malloc(sizeof(struct retangulo));
     p-&gt;tamanho = tamanho;
     p-&gt;amplitude = amplitude;
    return p;
}

void main()
{
    struct retangulo *retangulo1 = function(5,4);
    printf("Tamanho do retangulo = %d unidades\n", retangulo1-&gt;tamanho);
    printf("Amplitude do retangulo = %d unidades\n", retangulo1-&gt;amplitude);
    printf("Área do retangulo = %d unidades quadradas\n", retangulo1-&gt;length * retangulo1-&gt;amplitude);
}

 /* Saída */
Tamanho do retangulo = 5 unidades
Amplitude do retangulo = 4 unidades
Area do retangulo = 20 unidades quadradas</code></pre><p>Note que alocamos a memória de tamanho <code>struct retangulo</code> de forma dinâmica usando <code>malloc()</code>. Já que essa função retorna um ponteiro <em>void</em>, temos que utilizar <em>typecast</em> para transformar este retorno em um ponteiro do tipo <code>struct retangulo</code>.</p><h2 id="estrutura-autorreferencial">Estrutura autorreferencial</h2><p>Vimos que ponteiros podem ser um membro de uma estrutura também. O que ocorre, porém, se o ponteiro for um ponteiro de estrutura? O ponteiro pode ser tanto <strong>do mesmo tipo da estrutura </strong>ou<strong> diferente.</strong></p><p>Estruturas autorreferenciais são aquelas que possuem ponteiro(s) de estrutura do mesmo tipo do seu(s) membro(s).</p><pre><code class="language-c">struct estudante {
    char nome[20];
    int matricula;
    char sexo;
    int notas[5];
    struct estudante *next;
 };</code></pre><p>Essa é uma estrutura autorreferencial onde <code>next</code> é um ponteiro de estrutura do tipo <code>struct estudante</code>.</p><p>Agora, vamos criar duas estruturas de variáveis <code>estu1</code> e <code>estu2</code> e inicializá-las. Depois, vamos armazenar o endereço de <code>estu2</code> no membro <code>next</code> de <code>estu1</code>.</p><pre><code class="language-c">void main()
{
    struct estudante estu1 = {"Alex", 43, 'M', {76, 98, 68, 87, 93}, NULL};
    struct estudante estu2 = { "Max", 33, 'M', {87, 84, 82, 96, 78}, NULL};
    estu1.next = &amp;estu2;
}
</code></pre><p>Isso nos permite acessar os membros de <code>estu2</code> usando <code>estu1</code> e <code>next</code>.</p><pre><code class="language-c">void main()
{
    printf("Nome: %s\n", estu1.next-&gt;nome);
    printf("Matrícula: %d\n", estu1.next-&gt;matricula);
    printf("Sexo: %c\n", estu1.next-&gt;sexo);

    for(int i = 0; i &lt; 5; i++)
        printf("Notas na matéria %d: %d\n",i,estu1.next-&gt;notas[i]);
}

 /* Saída */
Nome: Max
Matrícula: 33
Sexo: M
Notas na matéria 0: 87
Notas na matéria 1: 84
Notas na matéria 2: 82
Notas na matéria 3: 96
Notas na matéria 4: 78
</code></pre><p>Suponha que queremos uma estrutura de variável diferente após <code>stu1</code>, ou seja, <em>inserir outra estrutura de variável entre <code>estu1</code> e <code>estu2</code></em>. Isso pode ser feito facilmente.</p><pre><code class="language-c">void main()
{
    struct estudante estuBetween = { "Gasly", 23, 'M', {83, 64, 88, 79, 91}, NULL};
    est1.next = &amp;estuBetween;
    estuBetween.next = &amp;estu2;
}
</code></pre><p>Agora <code>estu1.next</code> armazena o endereço de <code>estuBetween</code>. E <code>estuBetween.next</code> tem o endereço de <code>estu2</code>. Podemos, agora, acessar todas as três estruturas usando <code>estu1</code>.</p><pre><code class="language-c">  printf("Matrícula de %s: %d\n", estu1.next-&gt;nome, estu1.next-&gt;matricula);
    printf("Sexo de %s: %c\n", estu1.next-&gt;next-&gt;nome, estu1.next-&gt;next-&gt;sexo);

 /* Saída */
Matrícula de Gasly: 23
Sexo de Max: M</code></pre><p>Note como formamos uma ligação entre <code>estu1</code>, <code>estuBetween</code> e <code>estu3</code>. O que discutimos aqui foi o começo de uma <strong>Lista Ligada</strong> (<em>Linked List</em>)</p><p>Estruturas autorreferenciais são muito úteis na criação de estruturas de dados como a própria <em>lista ligada, pilhas, filas, grafos e daí por diante.</em></p><h2 id="conclus-o">Conclusão</h2><p>Feito! Abordamos tudo, desde a definição do que é uma estrutura, até o uso de estruturas autorreferenciais.</p><p>Tente revisar todos os subtópicos que você ler. Se conseguir lembrá-los, parabéns! Leia os que não conseguir lembrar novamente.</p><p>O próximo passo lógico seria aprender mais sobre listas ligadas e outras várias estruturas de dados que foram usadas aqui.</p><p>Continue aprendendo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tipos de dados em C – inteiros, de ponto flutuante e void explicados ]]>
                </title>
                <description>
                    <![CDATA[ Tipos de dados em C Há várias maneiras diferentes de se armazenar dados em C. São todas únicas em relação umas às outras. Os tipos de dados na forma em que uma informação pode ser armazenada são chamados de tipos de dados. O C não lida com a diversidade de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/tipos-de-dados-em-c-inteiros-de-ponto-flutuante-e-void-explicados/</link>
                <guid isPermaLink="false">63d606a491baea05fef71ff6</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Sun, 29 Jan 2023 22:15:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/01/5f9c9cf3740569d1a4ca3517.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/data-types-in-c-integer-floating-point-and-void-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/data-types-in-c-integer-floating-point-and-void-explained/</a>
      </p><h2 id="tipos-de-dados-em-c"><strong>Tipos de dados em C</strong></h2><p>Há várias maneiras diferentes de se armazenar dados em C. São todas únicas em relação umas às outras. Os tipos de dados na forma em que uma informação pode ser armazenada são chamados de tipos de dados. O C não lida com a diversidade de tipos de dados como outras linguagens. Como resultado, é importante garantir que você entende os tipos de dados existentes, suas capacidades e limitações.</p><p>Uma característica diferente dos tipos de dados em C está no fato de que eles dependem inteiramente do hardware no qual você está executando seu código. Um <code>int</code> no seu laptop será menor do que um <code>int</code> em um supercomputador. Desse modo, conhecer as limitações do hardware no qual você está trabalhando é importante. É por isso que os tipos de dados são definidos como sendo mínimos – um valor <code>int</code>, como você verá, é no mínimo de -32767 a 32767: em certas máquinas, ele poderá armazenar ainda mais valores do que esses.</p><p>Existem duas categorias que podemos usar para dividir esses valores: números inteiros e números de ponto flutuante. Os números inteiros são aqueles que não têm casas decimais. Podem ser positivos, negativos ou o zero. Números como -321, 497, 19345 e -976812 são números inteiros válidos. Já 4.5 não é válido por não ser um número sem casas decimais.</p><p>Números de ponto flutuante, por outro lado, são aqueles com casas decimais. Assim como os números inteiros, como -321, 497, 19345 e -976812 são todos válidos (podemos imaginar algo como .00 como sua "extensão"), agora, números como 4.5, 0.0004, -324.984 e outros números com casas decimais também são válidos.</p><p>O C nos permite escolher entre diversos tipos de dados, pois eles são todos armazenados de modos diferentes no computador. Como resultado, é importante estar atento às habilidades e limitações de cada tipo de dado para selecionar o mais apropriado.</p><h2 id="tipos-de-dados-inteiros"><strong>Tipos de dados inteiros</strong></h2><h3 id="caracteres-char"><strong>Caracteres: <code>char</code></strong></h3><p><code>char</code> são letras ou outros caracteres assemelhados, como pontuação e espaços. Em um computador, os caracteres são armazenados como números. Assim, <code>char</code> possui números inteiros que representam os caracteres. A tradução de fato é descrita pelo padrão ASCII. <a href="http://www.asciitable.com/" rel="nofollow">Aqui</a> vemos uma tabela útil para consulta.</p><p>O tamanho real, assim como ocorre com outros tipos de dados em C, depende do hardware com o qual você está trabalhando. Como mínimo, ele tem pelo menos 8 bits, o que nos traz números entre 0 e 127. Como alternativa, é possível usar <code>signed char</code> para obter, pelo menos, de -128 a 127.</p><h3 id="n-meros-inteiros-padr-o-int"><strong>Números inteiros padrão: <code>int</code></strong></h3><p>A quantidade de memória que um único <code>int</code> utiliza depende do hardware. No entanto, você pode esperar que um <code>int</code> tenha, pelo menos, 16 bits. Isso significa que ele pode armazenar valores de -32,768 a 32,767 ou mais, dependendo do hardware.</p><p>Assim como ocorre com os outros tipos de dados, há uma variante <code>unsigned</code> (sem sinal) que pode ser usada. O <code>unsigned int</code> pode ser positivo ou zero, mas não negativo. Por isso, ele pode armazenar valores de 0 a 65,535 ou mais, dependendo do hardware.</p><h3 id="inteiros-curtos-short"><strong>Inteiros curtos: <code>short</code></strong></h3><p>Esses não são usados com muita frequência, mas é bom saber que eles existem. Assim como ocorre com o <code>int</code>, ele pode armazenar de -32768 a 32767. Diferente do <code>int</code>, no entanto, essa é a extensão de sua capacidade. Onde você puder usar <code>short</code>, poderá usar <code>int</code>.</p><h3 id="inteiros-longos-long"><strong>Inteiros longos: <code>long</code></strong></h3><p>O tipo de dado <code>long</code> armazena números inteiros, como o <code>int</code>, mas oferece um intervalo maior de valores com o custo de ocupar mais memória. <code>long</code> armazena ao mesmo 32 bits, o que lhe confere um intervalo de -2,147,483,648 a 2,147,483,647. Como alternativa, pode-se usar <code>unsigned long</code> para um intervalo de 0 a 4,294,967,295.</p><h3 id="inteiros-ainda-mais-longos-long-long"><strong>Inteiros ainda mais longos: <code>long long</code></strong></h3><p>O tipo de dados <code>long long</code> é um excesso para quase todo tipo de aplicação, mas o C permitirá que você o use. Ele é capaz de armazenar, ao menos, de −9,223,372,036,854,775,807 a 9,223,372,036,854,775,807. Como alternativa, temos um excesso ainda maior com o <code>unsigned long long</code>, que permite que se use, pelo menos, de 0 a 18,446,744,073,709,551,615.</p><h2 id="tipos-de-dados-de-n-meros-de-ponto-flutuante"><strong>Tipos de dados de números de ponto flutuante</strong></h2><h3 id="n-meros-de-ponto-flutuante-b-sicos-float"><strong>Números de ponto flutuante básicos: <code>float</code></strong></h3><p><code>float</code> ocupa pelo menos 32 bits de armazenamento, mas nos dá 6 casas decimais, de 1.2E-38 a 3.4E+38.</p><h3 id="double-double"><strong>Double: <code>double</code></strong></h3><p><code>double</code> recebe o dobro da memória de <code>float</code> (ou seja, pelo menos, 64 bits). Por sua vez, <code>double</code> pode fornecer 15 casas decimais, de 2.3E-308 a 1.7E+308.</p><h3 id="um-intervalo-ainda-maior-para-double-long-double"><strong>Um intervalo ainda maior para double: <code>long double</code></strong></h3><p><code>long double</code> ocupa, pelo menos, 80 bits. Como resultado, podemos obter 19 casas decimais, de 3.4E-4932 a 1.1E+4932.</p><h2 id="escolhendo-o-tipo-de-dado-certo"><strong>Escolhendo o tipo de dado certo</strong></h2><p>A linguagem C faz com que precisemos ser bem específicos na escolha do tipo de dados e termos uma intenção clara ao fazer isso. Isso dá a você muito poder sobre seu código, mas é importante saber escolher certo.</p><p>Em geral, você deve buscar o mínimo necessário para sua tarefa. Se souber que contará números inteiros de 1 a 10 somente, não é necessário usar <code>long</code> nem <code>double</code>. Se souber que nunca precisará de números negativos, busque usar as variantes <code>unsigned</code> dos tipos de dados. Ao fornecer essa funcionalidade em vez de fazer isso automaticamente, o C consegue produzir um código muito leve e eficiente. Porém, você é o responsável, em sendo o programador, por entender as capacidades e as limitações e por escolher os tipos de dados adequadamente.</p><p>Podemos usar o operador <code>sizeof()</code> para verificar o tamanho de uma variável. Confira o programa em C abaixo para conferir o uso de memória dos vários tipos de dados:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int a = 1;
    
    char b ='G';
    
    double c = 3.14;
    
    printf("Ola mundo!\n");
 
    //Imprimindo as variáveis definidas acima junto do tamanho de cada uma
    printf("Ola! Eu sou um caractere. Meu valor e %c e "
           "eu tenho %lu bytes de tamanho.\n", b,sizeof(char));
    //Também é possível usar sizeof(b) acima
 
    printf("Ola! Eu sou um numero inteiro. Meu valor e %d e "
           "eu tenho %lu bytes de tamanho.\n", a,sizeof(int));
    //Também é possível usar sizeof(a) acima
 
    printf("Ola! Eu sou uma variavel double de ponto flutuante."
           "Meu valor e %lf e eu tenho %lu bytes de tamanho.\n",c,sizeof(double));
    //Também é possível usar sizeof(c) acima
 
    printf("Ate a proxima! :)\n");
    return 0;
}</code></pre><h3 id="resultado-"><strong>Resultado:</strong></h3><pre><code class="language-text">Ola mundo!
Ola! Eu sou um caractere. Meu valor e G e eu tenho %lu bytes de tamanho.
Ola! Eu sou um numero inteiro. Meu valor e 1 e eu tenho 4 bytes de tamanho.
Ola! Eu sou uma variavel double de ponto flutuante. Meu valor e 3.140000 e eu tenho 8 bytes de tamanho.
Ate a proxima! :)</code></pre><h2 id="o-tipo-void"><strong>O tipo v<strong><strong>oid</strong></strong></strong></h2><p>O tipo <code>void</code><em> </em>especifica que não há um valor disponível. Ele é usado em três situações:</p><h3 id="1-retornos-de-fun-o-como-void"><strong>1. Retornos de função como void</strong></h3><p>Existem várias funções em C que não retornam valor ou que se pode dizer que retornam um valor vazio (em inglês, <em>void</em>). Uma função sem valor de retorno tem o tipo de retorno <code>void</code>. Por exemplo, <code>void exit (int status);</code></p><h3 id="2-argumentos-de-fun-o-como-void"><strong>2. Argumentos de função como void</strong></h3><p>Existem várias funções em C que não aceitam parâmetros. Uma função sem parâmetros pode aceitar um valor <code>void</code>. Por exemplo, <code>int rand(void);</code></p><h3 id="3-ponteiros-para-void"><strong>3. Ponteiros para void</strong></h3><p>Um ponteiro do tipo void * representa o endereço de um objeto, mas não seu tipo. Por exemplo, uma função de alocação de memória <code>void *malloc( size_t size);</code> retorna um ponteiro para void, que pode ser convertido para qualquer tipo de dados.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O manual do iniciante em C: aprenda o básico sobre a linguagem de programação C em apenas algumas horas ]]>
                </title>
                <description>
                    <![CDATA[ O manual do iniciante em C segue a regra dos 80/20. Você aprenderá 80% da linguagem de programação C em 20% do tempo. Essa abordagem dará a você uma visão geral bem engendrada da linguagem. Este manual não busca cobrir tudo o que existe em relação ao C. Ele se ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/</link>
                <guid isPermaLink="false">62a0dc3308b5de06cf9f6181</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Fri, 22 Jul 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/coverc-1-opt.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-c-beginners-handbook/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The C Beginner's Handbook: Learn C Programming Language basics in just a few hours</a>
      </p><p>O manual do iniciante em C segue a regra dos 80/20. Você aprenderá 80% da linguagem de programação C em 20% do tempo.</p><p>Essa abordagem dará a você uma visão geral bem engendrada da linguagem.</p><p>Este manual não busca cobrir tudo o que existe em relação ao C. Ele se concentra no básico da linguagem, tentando simplificar os tópicos mais complexos.</p><p>Observe que: <a href="https://flaviocopes.com/page/c-handbook/">você pode obter uma versão em PDF ou em ePub do manual do iniciante em C aqui</a>.</p><p>Bom proveito!</p><h2 id="sum-rio"><strong>Sumário</strong></h2><ol><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#introdu-o-ao-c">Introdução ao C</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#vari-veis-e-tipos">Variáveis e tipos</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#constantes">Constantes</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#operadores">Operadores</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#condicionais">Condicionais</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#la-os">Laços</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#arrays">Arrays</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#strings">Strings</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#ponteiros">Ponteiros</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#fun-es">Funções</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#entrada-e-sa-da">Entrada e saída</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#escopo-das-vari-veis">Escopo das variáveis</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#vari-veis-est-ticas">Variáveis estáticas</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#vari-veis-globais">Variáveis globais</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#defini-es-de-tipo">Definições de tipo</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#tipos-enumerados">Tipos enumerados</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#estruturas">Estruturas</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#par-metros-da-linha-de-comando">Parâmetros da linha de comando</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#arquivos-de-cabe-alho-headers-">Arquivos de cabeçalho (<em>headers</em>)</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#o-pr-processador">O pré-processador</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-do-iniciante-em-c-aprenda-o-basico-sobre-a-linguagem-de-programacao-c-em-apenas-algumas-horas/#conclus-o">Conclusão</a></li></ol><h2 id="introdu-o-ao-c"><strong>Introdução ao C</strong></h2><p>O C é, provavelmente, a linguagem de programação mais amplamente conhecida. Ela é usada como linguagem de referência para os cursos de ciência da computação em todo mundo, sendo, possivelmente, a linguagem que as pessoas mais aprendem nas escolas, juntamente com Python e Java.</p><p>Eu me lembro de ela ser minha segundo linguagem de programação na vida, depois de aprender Pascal.</p><p>O C não é apenas o que os estudantes usam para aprender programação. Ela não é uma linguagem acadêmica. Eu diria, até, que não é a linguagem mais fácil, pois ela é uma linguagem de programação de nível mais baixo.</p><p>Hoje, o C é amplamente usado em dispositivos integrados, alimentando a maioria dos servidores de Internet, os quais são criados usando o Linux. O kernel do Linux foi criado em C, o que significa que o C também está no núcleo de todos os dispositivos Android. Podemos dizer que código em C está em execução em uma boa parte do mundo todo. Neste exato momento. Isso é algo bastante notável.</p><p>Quando foi criado, o C era considerado uma linguagem de alto nível, pois era portável entre as diversas máquinas. Hoje, consideramos algo óbvio que um programa seja escrito no Mac, no Windows ou no Linux, talvez usando o Node.js ou o Python.</p><p>Houve um tempo, no entanto, em que esse, definitivamente, não era o caso. O que o C ofereceu na época foi o fato de a linguagem ser simples de implementar, tendo um compilador que poderia ser portado facilmente para máquinas diferentes.</p><p>Eu falei em compilador: o C é uma linguagem de programação compilada, como o Go, o Java, o Swift ou o Rust. Outras linguagens de programação populares, como o Python, o Ruby ou o JavaScript, são interpretadas. A diferença é consistente: uma linguagem compilada gera um arquivo binário que pode ser executado e distribuído diretamente.</p><p>O C não tem um coletor de lixo. Isso quer dizer que precisamos lidar com o gerenciamento da memória por nossa conta. Essa é uma tarefa complexa e exige muita atenção para evitar bugs, mas também é o que faz com que o C seja ideal para escrever programas para dispositivos integrados como o Arduino.</p><p>O C não esconde por debaixo dos panos a complexidade e as habilidades da máquina. Você tem muito poder quando sabe o que fazer com ele.</p><p>Deixe-me apresentar o primeiro programa em C agora, o qual chamaremos de "Hello, World!" ("Olá, mundo!" em inglês)</p><p>hello.c</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    printf("Hello, World!");
}
</code></pre><p>Vamos descrever o código-fonte do programa: primeiro, importaremos a biblioteca <code>stdio</code> (o nome significa "biblioteca de entrada e saída padrão" - em inglês, <em>STanDard Input and Output</em>).</p><p>Essa biblioteca nos dá acesso às funções de entrada e saída.</p><p>O C é uma linguagem muito pequena em seu núcleo. Tudo o que não é parte do núcleo é fornecido por meio de bibliotecas. Algumas dessas bibliotecas foram criadas por programadores "normais" e disponibilizadas para que outros as utilizassem. Algumas outras bibliotecas foram criadas dentro do compilador, como a <code>stdio</code>, entre outras.</p><p>A <code>stdio</code> é a biblioteca que fornece a função <code>printf()</code>.</p><p>A função está envolvida em uma função <code>main()</code>. A função <code>main()</code> é o ponto de entrada de qualquer programa em C.</p><p>Mas, enfim, o que é uma função?</p><p>Uma função é uma rotina que recebe um ou mais argumentos e retorna um único valor.</p><p>No caso de <code>main()</code>, a função não recebe argumentos e retorna um número inteiro. Identificamos isso usando a palavra-chave <code>void</code> como argumento e a palavra-chave <code>int</code> para o valor de retorno.</p><p>A função tem um corpo, que é envolvido por chaves. Dentro do corpo da função, temos todo o código de que a função necessita para realizar suas operações.</p><p>A função <code>printf()</code> está escrita de modo diferente, como é possível ver. Ela não tem um valor de retorno definido e passamos a ela uma string, envolvida por aspas duplas. Não especificamos o tipo de argumento.</p><p>Isso ocorre porque essa é uma invocação de função. Em algum lugar, dentro da biblioteca <code>stdio</code>, <code>printf</code> está definida assim:</p><pre><code class="language-c">int printf(const char *format, ...);
</code></pre><p>Você não precisa entender o que isso significa agora, mas, resumindo, essa é a definição. Quando chamamos <code>printf("Hello, World!");</code>, a função será executada.</p><p>A função <code>main()</code> que definimos acima:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    printf("Hello, World!");
}
</code></pre><p>será executada pelo sistema operacional quando o programa for executado.</p><p>Como executamos um programa em C?</p><p>Conforme dissemos acima, C é uma linguagem compilada. Para executar o programa, primeiro precisamos compilá-lo. Todo computador Linux ou macOS já vem com um compilador de C integrado. No caso do Windows, você pode usar o Windows Subsystem for Linux (WSL).</p><p>Seja como for, ao abrir a janela do terminal, você pode digitar <code>gcc</code>. Esse comando retornará uma mensagem de erro, dizendo que você não especificou nenhum arquivo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.10.50.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.10.50" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.10.50.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.10.50.png 786w" sizes="(min-width: 720px) 720px" width="786" height="330" loading="lazy"></figure><p>Isso é bom. Significa que o compilador de C está lá e que podemos começar a utilizá-lo.</p><p>Agora, digite o programa acima em um arquivo <code>hello.c</code>. Você pode usar qualquer editor, mas, para fins de simplificar a vida, usarei o editor <code>nano</code> na linha de comando:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.11.39.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.11.39" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.11.39.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.11.39.png 786w" sizes="(min-width: 720px) 720px" width="786" height="330" loading="lazy"></figure><p>Digite o programa:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.16.52.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.16.52" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.16.52.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.16.52.png 786w" sizes="(min-width: 720px) 720px" width="786" height="426" loading="lazy"></figure><p>Agora, pressione <code>ctrl-X</code> para sair do nano:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.18.11.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.18.11" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.18.11.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.18.11.png 786w" sizes="(min-width: 720px) 720px" width="786" height="426" loading="lazy"></figure><p>Confirme pressionando a tecla <code>y</code> , e pressione Enter para confirmar o nome do arquivo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.18.15.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.18.15" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.18.15.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.18.15.png 786w" sizes="(min-width: 720px) 720px" width="786" height="426" loading="lazy"></figure><p>Isso, agora, nos levará de volta ao terminal:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.13.46.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.13.46" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.13.46.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.13.46.png 786w" sizes="(min-width: 720px) 720px" width="786" height="522" loading="lazy"></figure><p>Em seguida, digite:</p><pre><code class="language-sh">gcc hello.c -o hello
</code></pre><p>O programa não deve gerar erros:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.16.31.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.16.31" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.16.31.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.16.31.png 786w" sizes="(min-width: 720px) 720px" width="786" height="354" loading="lazy"></figure><p>mas deve ter gerado um executável chamado <code>hello</code>. Agora, digite</p><pre><code class="language-sh">./hello
</code></pre><p>para executar o programa:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.19.20.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.19.20" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.19.20.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.19.20.png 687w" width="687" height="306" loading="lazy"></figure><p>Antes do nome do programa, eu adicionei <code>./</code> para informar ao terminal que o comando está na pasta atual.</p><p>Ótimo!</p><p>Agora, se você chamar <code>ls -al hello</code>, poderá ver que o programa tem apenas 12KB de tamanho:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.19.55.png" class="kg-image" alt="Screen-Shot-2020-01-29-at-10.19.55" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-01-29-at-10.19.55.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-01-29-at-10.19.55.png 808w" sizes="(min-width: 720px) 720px" width="808" height="282" loading="lazy"></figure><p>Essa é uma das vantagens do C: ele é altamente otimizado, o que também é uma das razões para que ele seja bom para dispositivos integrados que tenham uma quantidade limitada de recursos.</p><h2 id="vari-veis-e-tipos"><strong>Variáveis e tipos</strong></h2><p>C é uma linguagem estaticamente tipada.</p><p>Isso significa que todas as variáveis têm um tipo associado. Esse tipo é conhecido em tempo de compilação.</p><p>É bem diferente da maneira como trabalhamos com variáveis em Python, JavaScript, PHP e outras linguagens interpretadas.</p><p>Ao criar uma variável em C, você tem de especificar o tipo de uma variável na declaração.</p><p>Neste exemplo, inicializamos a variável <code>age</code> com o tipo <code>int</code>:</p><pre><code class="language-c">int age;
</code></pre><p>O nome de uma variável pode conter letras maiúsculas e minúsculas, algarismo e o caractere de sublinha (<em>underscore</em>, em inglês), mas não podem começar por um algarismo. <code>AGE</code> e <code>Age10</code> são nomes válidos para variáveis, mas <code>1age</code> não é.</p><p>Você também pode iniciar uma variável no momento da declaração, especificando seu valor inicial:</p><pre><code class="language-c">int age = 37;
</code></pre><p>Ao declarar uma variável, você pode usá-la no código do programa. Você pode alterar seu valor a qualquer momento, usando o operador <code>=</code>, por exemplo, como em <code>age = 100;</code> (contanto que o novo valor seja do mesmo tipo).</p><p>Neste caso:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int age = 0;
    age = 37.2;
    printf("%u", age);
}
</code></pre><p>o compilador lançará um aviso no momento da compilação e converterá o número decimal em um valor inteiro.</p><p>Os tipos de dados integrados do C são <code>int</code>, <code>char</code>, <code>short</code>, <code>long</code>, <code>float</code>, <code>double</code> e <code>long double</code>. Vejamos um pouco mais a respeito deles.</p><h3 id="n-meros-inteiros"><strong>Números inteiros</strong></h3><p>O C nos fornece os seguintes tipos para que possamos definir valores inteiros:</p><ul><li><code>char</code></li><li><code>int</code></li><li><code>short</code></li><li><code>long</code></li></ul><p>Na maior parte das vezes, você provavelmente usará um <code>int</code> para armazenar um número inteiro. Em alguns casos, no entanto, você pode querer escolher uma das outras três opções.</p><p>O tipo <code>char</code> normalmente é usado para armazenar letras da tabela ASCII, mas pode ser usada para conter números inteiros pequenos, entre <code>-128</code> e <code>127</code>. Ele ocupa menos de 1 byte.</p><p><code>int</code> ocupa pelo menos 2 bytes. <code>short</code> ocupa pelo menos 2 bytes. <code>long</code> ocupa pelo menos 4 bytes.</p><p>Como você pode ver, não temos a garantia dos mesmos valores para ambientes diferentes. Temos apenas uma indicação. O problema é que os números exatos que podem ser armazenados em cada tipo de dados dependem da implementação e da arquitetura.</p><p>O que temos garantido é que <code>short</code> não é maior do que <code>int</code> e que <code>long</code> não é menor do que <code>int</code>.</p><p>O padrão das especificações ANSI C determina os valores mínimos para cada tipo. Graças a isso, podemos ao menos saber qual é o valor mínimo que podemos esperar ter à nossa disposição.</p><p>Se você estiver programando em C em um Arduino, placas de circuito diferentes terão limites diferentes.</p><p>Em uma placa Arduino Uno, <code>int</code> armazena um valor de 2 bytes, indo de <code>-32,768</code> a <code>32,767</code>. Em uma placa Arduino MKR 1010, <code>int</code> armazena um valor de 4 bytes, indo de <code>-2,147,483,648</code> a <code>2,147,483,647</code>, o que traz uma grande diferença.</p><p>Em todas as placas Arduino, <code>short</code> armazena um valor de 2 bytes, indo de <code>-32,768</code> a <code>32,767</code>. <code>long</code> armazena 4 bytes, indo de <code>-2,147,483,648</code> a <code>2,147,483,647</code>.</p><h3 id="n-meros-inteiros-sem-sinal"><strong>Números inteiros sem sinal</strong></h3><p>Para todos os tipos de dados acima, podemos anexar antes deles a expressão <code>unsigned</code> (em português, sem sinal) para iniciar o intervalo em 0, em vez de em um número negativo. Isso pode fazer sentido em diversos casos.</p><ul><li><code>unsigned char</code> irá de <code>0</code> a pelo menos <code>255</code></li><li><code>unsigned int</code> irá de <code>0</code> a pelo menos <code>65,535</code></li><li><code>unsigned short</code> irá de <code>0</code> a pelo menos <code>65,535</code></li><li><code>unsigned long</code> irá de <code>0</code> a pelo menos <code>4,294,967,295</code></li></ul><h3 id="o-problema-com-o-overflow"><strong>O problema com o overflow</strong></h3><p>Em função de todos esses limites, pode surgir uma pergunta: como podemos nos certificar de que nossos números não excedem o limite? O que acontece se excedermos o limite?</p><p>Se você tem um número <code>unsigned int</code> de 255 e somar mais um a ele, terá um retorno de 256, conforme o esperado. Se tiver um número <code>unsigned char</code> de 255 e somar mais um a ele, terá um retorno de 0. Ele retornará ao valor inicial possível.</p><p>Se você tiver um número <code>unsigned char</code> de 255 e adicionar 10 a ele, chegará ao número <code>9</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  unsigned char j = 255;
  j = j + 10;
  printf("%u", j); /* 9 */
}
</code></pre><p>Se você não tiver um valor com sinal, o comportamento é indefinido. Ele, basicamente, fornecerá um número enorme e que pode variar, como neste caso:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char j = 127;
  j = j + 10;
  printf("%u", j); /* 4294967177 */
}
</code></pre><p>Em outras palavras, o C não protege você de passar dos limites de um tipo. Você é quem deve se preocupar com essa questão.</p><h3 id="avisos-ao-declarar-o-tipo-errado"><strong>Avisos ao declarar o tipo errado</strong></h3><p>Ao declarar a variável e inicializá-la com um valor do tipo incorreto, o compilador <code>gcc</code> (o que você provavelmente usará) deverá dar um aviso semelhante a este:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char j = 1000;
}
</code></pre><pre><code>hello.c:4:11: warning: implicit conversion 
  from 'int' to
      'char' changes value from 1000 to -24
      [-Wconstant-conversion]
        char j = 1000;
             ~   ^~~~
1 warning generated.
</code></pre><p>Ele também avisará você no caso de atribuições diretas:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char j;
  j = 1000;
}
</code></pre><p>Ele não fará isso, porém, se você aumentar o número usando, por exemplo, <code>+=</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char j = 0;
  j += 1000;
}
</code></pre><h3 id="n-meros-de-ponto-flutuante"><strong>Números de ponto flutuante</strong></h3><p>Os tipos de ponto flutuante (<code>float</code>, <code>double</code> e <code>long double</code>) podem representar um conjunto muito maior de valores do que os inteiros, podendo, também, representar frações, algo que os números inteiros não conseguem fazer.</p><p>Ao usar números de ponto flutuante, representamos números como decimais na potência de 10.</p><p>Você poderá ver números de ponto flutuante escritos assim:</p><ul><li><code>1.29e-3</code></li><li><code>-2.3e+5</code></li></ul><p>além de outros escritos de maneira estranha.</p><p>Os tipos:</p><ul><li><code>float</code></li><li><code>double</code></li><li><code>long double</code></li></ul><p>são usados para representar números com pontos decimais (tipos de ponto flutuante). Todos podem representar números positivos e negativos.</p><p>Os requisitos mínimos para qualquer implementação em C são de que <code>float</code> possa representar um intervalo entre &nbsp;10^-37 e 10^+37, sendo tipicamente implementados usando 32 bits. <code>double</code> pode representar um conjunto mais de números. <code>long double</code> pode ter ainda mais números.</p><p>Os valores exatos, assim como ocorre com os números inteiros, dependem da implementação.</p><p>Em um Mac moderno, um <code>float</code> é representado por 32 bits, tendo uma precisão de 24 bits significativos. 8 bits são usados para codificar o expoente.</p><p>Um número <code>double</code> é representado por 64 bits, com uma precisão de 53 bits significativos, sendo usados 11 bits para codificar o expoente.</p><p>O tipo <code>long double</code> é representado por 80 bits, tem uma precisão de 64 bits significativos, sendo usados 15 bits para codificar o expoente.</p><p>Em nosso computador especificamente, como podemos determinar o tamanho dos tipos? Você pode escrever um programa que faça isso por você:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  printf("Tamanho de char: %lu bytes\n", sizeof(char));
  printf("Tamanho de int: %lu bytes\n", sizeof(int));
  printf("Tamanho de short: %lu bytes\n", sizeof(short));
  printf("Tamanho de long: %lu bytes\n", sizeof(long));
  printf("Tamanho de float: %lu bytes\n", sizeof(float));
  printf("Tamanho de double: %lu bytes\n", 
    sizeof(double));
  printf("Tamanho de long double: %lu bytes\n", 
    sizeof(long double));
}
</code></pre><p>Em meu sistema, um Mac moderno, veremos:</p><pre><code>Tamanho de char: 1 bytes
Tamanho de int: 4 bytes
Tamanho de short: 2 bytes
Tamanho de long: 8 bytes
Tamanho de float: 4 bytes
Tamanho de double: 8 bytes
Tamanho de long double: 16 bytes
</code></pre><h2 id="constantes"><strong>Constantes</strong></h2><p>Vamos, agora, falar das constantes.</p><p>Uma constante é declarada de modo semelhante às variáveis, exceto pelo fato de ter a palavra-chave <code>const</code> adicionada antes da declaração. Além disso, você sempre precisará adicionar na declaração um valor específico.</p><p>Por exemplo:</p><pre><code class="language-c">const int age = 37;
</code></pre><p>Esse código é perfeitamente válido em C, mas é comum declarar as constantes em letra maiúscula, assim:</p><pre><code class="language-c">const int AGE = 37;
</code></pre><p>É apenas uma convenção, mas pode ajudar muito ao ler ou escrever um programa em C, já que aumenta a legibilidade. Um nome em letras maiúsculas significa que é uma constante, enquanto, em letras minúsculas, temos uma variável.</p><p>Um nome de constante segue as mesmas regras dos nomes de variáveis: podem conter letras maiúsculas e minúsculas, algarismos e o caractere de sublinha, mas não pode começar com um algarismo. <code>AGE</code> e <code>Age10</code> são nomes de variável válidos, enquanto <code>1AGE</code> não é.</p><p>Outra maneira de definir constantes é usando essa sintaxe:</p><pre><code class="language-c">#define AGE 37
</code></pre><p>Neste caso, não é necessário adicionar um tipo, também não sendo preciso adicionar um sinal de igual <code>=</code>. Você deve omitir o ponto e vírgula do final.</p><p>O compilador do C fará a inferência do tipo a partir do valor especificado, em tempo de compilação.</p><h2 id="operadores"><strong>Operadores</strong></h2><p>O C nos oferece uma grande variedade de operadores que podemos usar para fazer operações com os dados.</p><p>Especificamente, podemos identificar alguns grupos de operadores:</p><ul><li>operadores aritméticos</li><li>operadores de comparação</li><li>operadores lógicos</li><li>operadores de atribuição compostos</li><li>operadores bitwise</li><li>operadores de ponteiro</li><li>operadores de estrutura</li><li>operadores diversos</li></ul><p>Nesta seção, detalharei todos eles usando 2 variáveis imaginárias, <code>a</code> e <code>b</code>, como exemplo.</p><p>Deixarei os operadores bitwise, de estrutura e de ponteiro fora dessa lista para manter o guia simples</p><h3 id="operadores-aritm-ticos">Operadores a<strong>ritméticos</strong></h3><p>Neste grupo mais amplo, separarei os operadores binários e os unários.</p><p>Os operadores binários funcionam usando dois operandos:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(24, 26, 27); color: rgb(218, 215, 210); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOME</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">EXEMPLO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Atribuição</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a = b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">+</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Adição</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a + b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">-</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Subtração</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a - b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">*</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Multiplicação</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a * b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">/</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Divisão</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a / b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">%</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Módulo</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a % b</code></td></tr></tbody></table><!--kg-card-end: html--><p>Operadores unários recebem apenas um operando:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(24, 26, 27); color: rgb(218, 215, 210); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOME</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">EXEMPLO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">+</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Unário de soma</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">+a</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">-</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Unário de subtração</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">-a</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">++</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Incremento</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a++</code><span>&nbsp;</span>or<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">++a</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">--</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Decremento</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a--</code><span>&nbsp;</span>or<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">--a</code></td></tr></tbody></table><!--kg-card-end: html--><p>A diferença entre <code>a++</code> e <code>++a</code> é que <code>a++</code> incrementa a variável <code>a</code> após seu uso. <code>++a</code> incrementa a variável <code>a</code> antes de usá-la.</p><p>Por exemplo:</p><pre><code class="language-c">int a = 2;
int b;
b = a++ /* b é 2, a é 3 */
b = ++a /* b é 4, a é 4 */
</code></pre><p>Isso também se aplica aos operadores de decremento.</p><h3 id="operadores-de-compara-o"><strong>Operadores de comparação</strong></h3><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(24, 26, 27); color: rgb(218, 215, 210); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOME</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">EXEMPLO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">==</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Operador de igual</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a == b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">!=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Operador de diferente</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a != b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">&gt;</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Maior que</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &gt; b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">&lt;</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Menor que</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &lt; b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">&gt;=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Maior que ou igual a</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &gt;= b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">&lt;=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Menor que ou igual a</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &lt;= b</code></td></tr></tbody></table><!--kg-card-end: html--><h3 id="operadores-l-gicos"><strong>Operadores lógicos</strong></h3><ul><li><code>!</code> NOT (em português, "não" - exemplo: <code>!a</code>)</li><li><code>&amp;&amp;</code> AND (em português, "e" - exemplo: <code>a &amp;&amp; b</code>)</li><li><code>||</code> OR (em português, "ou" - exemplo: <code>a || b</code>)</li></ul><p>Esses operadores são ótimos ao se trabalhar com valores booleanos.</p><h3 id="operadores-de-atribui-o-compostos"><strong>Operadores de atribuição compostos</strong></h3><p>Esses operadores são úteis para realizar uma atribuição e, ao mesmo tempo, realizar uma operação aritmética:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(24, 26, 27); color: rgb(218, 215, 210); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOME</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">EXEMPLO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">+=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Atribuição e adição</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a += b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">-=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Atribuição e subtração</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a -= b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">*=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Atribuição e multiplicação</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a *= b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">/=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Atribuição e divisão</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a /= b</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">%=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">Atribuição e módulo</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a %= b</code></td></tr></tbody></table><!--kg-card-end: html--><h3 id="o-operador-tern-rio"><strong>O operador ternário</strong></h3><p>O operador ternário é o único operador em C que funciona com 3 operandos, sendo um modo abreviado de expressar condicionais.</p><p>Ele tem essa aparência:</p><pre><code class="language-c">&lt;condição&gt; ? &lt;expressão&gt; : &lt;expressão&gt;
</code></pre><p>Exemplo:</p><pre><code class="language-c">a ? b : c
</code></pre><p>Se <code>a</code> for avaliado como <code>true</code>, a instrução <code>b</code> será executada. Caso contrário, é executada a instrução <code>c</code>.</p><p>O operador ternário, em termos de sua funcionalidade, é equivalente ao condicional if/else, exceto pelo fato de ser menor e de podermos colocar nele toda uma expressão em uma única linha.</p><h3 id="sizeof"><strong>sizeof</strong></h3><p>O operador <code>sizeof</code> retorna o tamanho do operando que você passar. É possível passar uma variável ou, até mesmo, um tipo.</p><p>Exemplo de uso:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  int age = 37;
  printf("%ld\n", sizeof(age));
  printf("%ld", sizeof(int));
}
</code></pre><h3 id="preced-ncia-dos-operadores"><strong>Precedência dos operadores</strong></h3><p>Com todos esses operadores (e mais, já que não tratamos de todos neste artigo, incluindo os operadores bitwise, de estrutura e de ponteiro), devemos prestar atenção a quando eles estiverem juntos em uma única expressão.</p><p>Vamos supor que temos esta operação:</p><pre><code class="language-c">int a = 2;
int b = 4;
int c = b + a * a / b - a;
</code></pre><p>Qual é o valor de <code>c</code>? A adição é executada antes da multiplicação e da divisão?</p><p>Existe um conjunto de regras que nos ajuda a resolver esse enigma.</p><p>Na ordem de menor precedência para a maior, temos:</p><ul><li>o operador de atribuição <code>=</code></li><li>os operadores <strong>binários</strong> <code>+</code> e <code>-</code> </li><li>os operadores <code>*</code> e <code>/</code> </li><li>os operadores <code>+</code> e <code>-</code> unários</li></ul><p>Os operadores também têm uma regra de associação, que é sempre da esquerda para a direita, exceto para os operadores unários e de atribuição.</p><p>Em:</p><pre><code class="language-c">int c = b + a * a / b - a;
</code></pre><p>Primeiro, executamos <code>a * a / b</code>, que, devido ao fato de ser da esquerda para a direita, separamos em <code>a * a</code> e o resultado <code>/ b</code>: <code>2 * 2 = 4</code>, <code>4 / 4 = 1</code>.</p><p>Depois, realizamos a soma e a subtração: 4 + 1 - 2. O valor de <code>c</code> é <code>3</code>.</p><p>Em todos os casos, no entanto, eu gostaria de reforçar que é possível usar os parênteses de modo a tornar expressões semelhantes mais fáceis de ler e de compreender.</p><p>Os parênteses têm maior prioridade sobre todo o resto.</p><p>A expressão do exemplo acima pode ser reescrita assim:</p><pre><code class="language-c">int c = b + ((a * a) / b) - a;
</code></pre><p>e, desse modo, não temos que nos preocupar muito com ela.</p><h2 id="condicionais"><strong>Condicionais</strong></h2><p>Todas as linguagens de programação fornecem aos programadores a capacidade de realizar escolhas.</p><p>Em alguns casos, queremos realizar a ação X. Em outros, a ação Y.</p><p>Queremos verificar os dados e fazer escolhas com base no estado desses dados.</p><p>O C nos fornece duas maneiras de fazer isso.</p><p>A primeira é a instrução <code>if</code>, com seu auxiliar <code>else</code>, e a segunda é a instrução <code>switch</code>.</p><h3 id="if"><strong>if</strong></h3><p>Em uma instrução <code>if</code> (<em>se</em>, em português), você pode conferir se uma condição é verdadeira e executar o bloco fornecido entre chaves:</p><pre><code class="language-c">int a = 1;

if (a == 1) {
  /* Realizar uma ação */
}
</code></pre><p>Você pode anexar um bloco <code>else</code> (senão, em português) para executar um bloco diferente se a condição não for verdadeira (em outras palavras, se ela for falsa):</p><pre><code class="language-c">int a = 1;

if (a == 2) {
  /* Realizar uma ação */
} else {
  /* Realizar outra ação, caso contrário */
}
</code></pre><p>Cuidado com uma fonte comum de erros - sempre use o operador de comparação <code>==</code> para fazer comparações, não o operador de atribuição <code>=</code>. Do contrário, a verificação do condicional <code>if</code> será sempre verdadeira, a menos que o argumento seja <code>0</code>. Por exemplo, se você executar esse código:</p><pre><code class="language-c">int a = 0;

if (a = 0) {
  /* O que estiver aqui nunca será chamado */
}
</code></pre><p>Por que isso acontece? Porque a verificação do condicional buscará um resultado booleano (<em>true</em>/<em>false</em>, verdadeiro ou falso, o resultado de uma comparação). O número <code>0</code> sempre será igual ao valor <em>false</em>. Todo o resto será igual a <em>true</em>, incluindo números negativos.</p><p>Você também pode ter diversos blocos de <code>else</code> empilhando-os na forma de instruções <code>else if</code>:</p><pre><code class="language-c">int a = 1;

if (a == 2) {
  /* Realizar uma ação */
} else if (a == 1) {
  /* Realizar outra ação */
} else {
  /* Realizar uma terceira ação */
}
</code></pre><h3 id="switch"><strong>switch</strong></h3><p>Caso precise fazer muitos blocos <em>if</em>/<em>else</em>/<em>else if</em> para realizar uma verificação, talvez por precisar verificar o valor exato de uma variável, a instrução <code>switch</code> (algo como <em>chave</em> em português) pode ser bastante útil para você.</p><p>Você pode fornecer uma variável como condição e uma série de pontos de entrada <code>case</code> (<em>caso</em>, em português) para cada valor que você espera:</p><pre><code class="language-c">int a = 1;

switch (a) {
  case 0:
    /* Realizar uma ação */
    break;
  case 1:
    /* Realizar outra ação */
    break;
  case 2:
    /* Realizar outra ação */
    break;
}
</code></pre><p>Precisamos usar a palavra-chave <code>break</code> ao final de cada <em>case</em> para evitar que o próximo <em>case</em> seja executado depois de o anterior ter sido concluído. Esse efeito "cascata" pode ser útil de maneiras bastante criativas.</p><p>Você pode usar um <em>case</em> que valha para várias situações ao final, chamado de <code>default</code>:</p><pre><code class="language-c">int a = 1;

switch (a) {
  case 0:
    /* Realizar uma ação */
    break;
  case 1:
    /* Realizar outra ação */
    break;
  case 2:
    /* Realizar outra ação */
    break;
  default:
    /* Para todos os outros casos */
    break;
}
</code></pre><h2 id="la-os"><strong>Laços</strong></h2><p>O C nos oferece três maneiras de realizar um laço: <strong>laços <strong>for</strong></strong>, <strong>laços w<strong>hile </strong></strong>e <strong>laços do<strong> while</strong></strong>. Todos eles permitem percorrer os elementos de um array, mas com algumas diferenças. Vamos vê-los em detalhes.</p><h3 id="la-os-for"><strong>Laços for</strong></h3><p>O primeiro modo e, provavelmente, o mais comum de se realizar um laço é usando <strong>laços f<strong>or</strong></strong>.</p><p>Usando a palavra-chave <code>for</code>, podemos definir as <em><em>r</em>egras</em> para o laço desde o início e, então, fornecer o bloco que será executado repetidamente.</p><p>Aqui vemos um exemplo:</p><pre><code class="language-c">for (int i = 0; i &lt;= 10; i++) {
  /* as instruções a serem repetidas */
}
</code></pre><p>O bloco <code>(int i = 0; i &lt;= 10; i++)</code> contém 3 partes com os detalhes do laço:</p><ul><li>a condição inicial (<code>int i = 0</code>)</li><li>o teste (<code>i &lt;= 10</code>)</li><li>o incremento (<code>i++</code>)</li></ul><p>Definimos, primeiramente, a variável do laço. Neste caso, a chamamos de <code>i</code>. <code>i</code> é uma variável comum que será usada em laços, assim como <code>j</code> para laços aninhados (um laço dentro de outro laço). Ambas são usadas apenas por convenção.</p><p>A variável é inicializada com o valor de 0 (zero) e a primeira iteração é realizada. Logo, vem a parte do incremento (<code>i++</code>, neste caso, que incrementa a variável em 1), e todo o ciclo é repetido até você receber o número 10.</p><p>Dentro do bloco principal do laço, podemos acessar a variável <code>i</code> para saber em que iteração estamos. Este programa deve imprimir <code>0 1 2 3 4 5 5 6 7 8 9 10</code>:</p><pre><code class="language-c">for (int i = 0; i &lt;= 10; i++) {
  /* as instruções a serem repetidas */
  printf("%u ", i);
}
</code></pre><p>Laços podem iniciar em um número maior e diminuir de acordo, assim:</p><pre><code class="language-c">for (int i = 10; i &gt; 0; i--) {
  /* as instruções a serem repetidas */
}
</code></pre><p>Você também pode incrementar a variável de laço de 2 em 2 ou de acordo com algum outro valor:</p><pre><code class="language-c">for (int i = 0; i &lt; 1000; i = i + 30) {
  /* as instruções a serem repetidas */
}
</code></pre><h3 id="la-os-while"><strong>Laços while</strong></h3><p><strong>Os laços w<strong>hile </strong></strong>são mais simples de escrever do que os laços <code>for</code>, mas exige um pouco mais de trabalho de sua parte.</p><p>Em vez de definir todo o laço de início ao começar o laço, como é feito no laço <code>for</code>, usando <code>while</code>, apenas verificamos uma condição:</p><pre><code class="language-c">while (i &lt; 10) {

}
</code></pre><p>Esta maneira de escrever leva em consideração que <code>i</code> já esteja definida e inicializada com um valor.</p><p>Esse laço, porém, será um <strong>laço i<strong>nfinit</strong>o</strong>, a menos que você incremente a variável <code>i</code> em algum momento, dentro do laço. Um laço infinito é ruim, pois bloqueará o programa, não permitindo que mais nada aconteça.</p><p>É isso que você precisa para fazer um laço while "correto":</p><pre><code class="language-c">int i = 0;

while (i &lt; 10) {
  /* realizar uma ação */

  i++;
}
</code></pre><p>Existe uma exceção a isso - e a veremos em um minuto. Antes, permitam-me apresentar o laço <code>do while</code>.</p><h3 id="la-os-do-while"><strong>Laços do while</strong></h3><p>Embora os laços while sejam ótimos, pode haver situações em que você precise fazer uma coisa específica: executar um bloco ao menos uma vez <em>sempre </em>e, <em>talvez</em>, repeti-lo.</p><p>Isso é feito usando as palavras-chave <code>do while</code>. De certa forma, ele é muito semelhante a um laço <code>while</code>, com uma única diferença:</p><pre><code class="language-c">int i = 0;

do {
  /* realizar uma ação */

  i++;
} while (i &lt; 10);
</code></pre><p>O bloco que contém o comentário <code>/* realizar uma ação */</code> sempre é executado ao menos uma vez, não importando a verificação da condição abaixo.</p><p>Então, enquanto a variável <code>i</code> for inferior a 10, o bloco será repetido.</p><h3 id="saindo-de-um-la-o-usando-break"><strong>Saindo de um laço usando <em>break</em></strong></h3><p>Em todos os laços da linguagem C, temos um modo de sair do laço a qualquer momento, imediatamente, não importando as condições definidas pelo laço.</p><p>Isso é feito usando a palavra-chave <code>break</code>.</p><p>Isso é útil em várias situações. Você pode querer verificar o valor de uma variável, por exemplo:</p><pre><code class="language-c">for (int i = 0; i &lt;= 10; i++) {
  if (i == 4 &amp;&amp; someVariable == 10) {
    break;
  }
}
</code></pre><p>Essa opção de sair de um laço é particularmente interessante para laços <code>while</code> (e <code>do while</code>), pois podemos criar laços aparentemente infinitos que se encerram quando uma condição ocorre. Você define isso dentro do bloco do laço:</p><pre><code class="language-c">int i = 0;
while (1) {
  /* realizar uma ação */

  i++;
  if (i == 10) break;
}
</code></pre><p>É muito comum termos esse tipo de laço em C.</p><h2 id="arrays"><strong>Arrays</strong></h2><p>Um array é uma variável que armazena diversos valores.</p><p>Todos os valores em um array, em C, precisam ter o <strong>mesmo tipo</strong>. Em outras palavras, teremos apenas arrays de valores <code>int</code>, arrays de valores <code>double</code> e assim por diante.</p><p>Você pode definir um array de valores <code>int</code>, assim:</p><pre><code class="language-c">int prices[5];
</code></pre><p>Você deve sempre especificar o tamanho do array. O C não fornece arrays dinâmicos nativamente (é preciso usar uma estrutura de dados, como uma lista vinculada, para que isso seja possível).</p><p>Você pode usar uma constante para definir o tamanho:</p><pre><code class="language-c">const int SIZE = 5;
int prices[SIZE];
</code></pre><p>Você pode inicializar um no momento da definição, assim:</p><pre><code class="language-c">int prices[5] = { 1, 2, 3, 4, 5 };
</code></pre><p>Além disso, você pode atribuir um valor após a definição, desta forma:</p><pre><code class="language-c">int prices[5];

prices[0] = 1;
prices[1] = 2;
prices[2] = 3;
prices[3] = 4;
prices[4] = 5;
</code></pre><p>Ou ainda, de um modo mais prático, usando um laço:</p><pre><code class="language-c">int prices[5];

for (int i = 0; i &lt; 5; i++) {
  prices[i] = i + 1;
}
</code></pre><p>Você também pode referenciar um item no array usando colchetes após o nome da variável array, adicionando um número inteiro para determinar o valor do índice, assim:</p><pre><code class="language-c">prices[0]; /* valor do item do array: 1 */
prices[1]; /* valor do item do array: 2 */
</code></pre><p>Os índices do array iniciam em 0 (zero). Desse modo, um array com 5 itens, como o array <code>prices</code> acima, terá itens que vão de <code>prices[0]</code> até <code>prices[4]</code>.</p><p>Algo interessante sobre os arrays em C é o fato de que todos os elementos são armazenados em sequência, um após o outro. Isso não é algo que normalmente ocorra com linguagens de programação de alto nível.</p><p>Outra questão que vale a pena saber é sobre o nome da variável do array, como <code>prices</code>, no exemplo acima. O nome é um <strong><strong>po</strong>nteiro</strong> do primeiro elemento do array. Assim, ele pode ser usado como um ponteiro normal.</p><p>Falaremos mais sobre ponteiros adiante.</p><h2 id="strings"><strong>Strings</strong></h2><p>Em C, as strings são um tipo especial de array: uma string é um array de valores <code>char</code>:</p><pre><code class="language-c">char name[7];
</code></pre><p>Apresentei o tipo <code>char</code> quando falamos em tipos, mas, resumidamente, ele é comumente usado para armazenar letras da tabela ASCII.</p><p>Uma string pode ser inicializada da mesma maneira como você inicializa um array normal:</p><pre><code class="language-c">char name[7] = { "F", "l", "a", "v", "i", "o" };
</code></pre><p>Ou ainda, de modo mais conveniente, como uma <em>string literal</em> (também chamada de <em>string constante</em>), uma sequência de caracteres envoltas em aspas duplas:</p><pre><code class="language-c">char name[7] = "Flavio";
</code></pre><p>Você pode imprimir uma string com <code>printf()</code> usando <code>%s</code>:</p><pre><code class="language-c">printf("%s", name);
</code></pre><p>Percebeu como "Flavio" tem 6 caracteres, mas eu defini um array de tamanho 7? Por quê? Isso ocorre porque o último caractere de uma string deve ser um valor <code>0</code>, o finalizador da string e precisamos deixar um espaço para ele.</p><p>É importante ter isso em mente, especialmente ao manipular strings.</p><p>Falando em manipular strings, existe uma biblioteca padrão importante fornecida pelo C: <code>string.h</code>.</p><p>Essa biblioteca é essencial, pois ela abstrai muitos dos detalhes de baixo nível ao trabalhar com strings e nos fornece um conjunto de funções úteis.</p><p>Você pode carregar a biblioteca em seu programa, adicionando-o na parte superior:</p><pre><code class="language-c">#include &lt;string.h&gt;
</code></pre><p>Quando fizer isso, você terá acesso a:</p><ul><li><code>strcpy()</code> para copiar uma string sobre outra</li><li><code>strcat()</code> para anexar uma string à outra</li><li><code>strcmp()</code> para comparar se duas strings são iguais</li><li><code>strncmp()</code> para comparar os primeiros <code>n</code> caracteres de duas strings</li><li><code>strlen()</code> para calcular o tamanho de uma string</li></ul><p>e muito, muito mais.</p><h2 id="ponteiros"><strong>Ponteiros</strong></h2><p>Os ponteiros são uma das partes mais confusas/desafiadoras da linguagem C, na minha opinião. Em especial, se você está recém começando em programação, mas também se você vier de uma linguagem de programação de alto nível, como o Python ou o JavaScript.</p><p>Nesta seção, eu quero apresentá-los da maneira mais simples possível, mas sem imbecilizar a definição.</p><p>Um ponteiro é o endereço de um bloco de memória que contém uma variável.</p><p>Quando você declara um número inteiro assim:</p><pre><code class="language-c">int age = 37;
</code></pre><p>É possível usar o operador <code>&amp;</code> para obter o valor do endereço na memória de uma variável:</p><pre><code class="language-c">printf("%p", &amp;age); /* 0x7ffeef7dcb9c */
</code></pre><p>Usei o formato <code>%p</code> especificado em <code>printf()</code> para imprimir o valor do endereço.</p><p>Podemos atribuir o endereço a uma variável:</p><pre><code class="language-c">int *address = &amp;age;
</code></pre><p>Usando <code>int *address</code> na declaração, não estamos declarando uma variável inteira, mas um <strong><strong>po</strong>nteiro para um número inteiro</strong>.</p><p>Podemos usar o operador de ponteiro <code>*</code> para obter o valor da variável para a qual um endereço está apontando:</p><pre><code class="language-c">int age = 37;
int *address = &amp;age;
printf("%u", *address); /* 37 */
</code></pre><p>Dessa vez, estamos usando o operador de ponteiro novamente, mas, como ele não é uma declaração agora, isso significa "o valor da variável para a qual esse ponteiro está apontando".</p><p>Neste exemplo, declaramos uma variável <code>age</code> e usamos um ponteiro para inicializar o valor:</p><pre><code class="language-c">int age;
int *address = &amp;age;
*address = 37;
printf("%u", *address);
</code></pre><p>Ao trabalhar com o C, você verá que várias coisas são construídas tendo como base esse conceito simples. Certifique-se, então, de se familiarizar um pouco com ele executando os exemplos acima por conta própria.</p><p>Ponteiros são uma grande oportunidade, pois eles nos forçam a pensar sobre endereços de memória e sobre como os dados são organizados.</p><p>Arrays são um exemplo. Quando você declara um array:</p><pre><code class="language-c">int prices[3] = { 5, 4, 3 };
</code></pre><p>A variável <code>prices</code> é, de fato, um ponteiro para o primeiro item do array. Você pode obter o valor do primeiro item usando essa função <code>printf()</code>, neste caso:</p><pre><code class="language-c">printf("%u", *prices); /* 5 */
</code></pre><p>O interessante aqui é que podemos obter o segundo item adicionando 1 ao ponteiro de <code>prices</code>:</p><pre><code class="language-c">printf("%u", *(prices + 1)); /* 4 */
</code></pre><p>E assim por diante, para todos os outros valores.</p><p>Também podemos fazer muitas operações de manipulação de strings interessantes, já que strings são arrays internamente.</p><p>Também temos muitas outras aplicações, incluindo passar a referência de um objeto ou de uma função para evitar de consumir mais recursos ao copiar esse objeto ou essa função.</p><h2 id="fun-es"><strong>Funções</strong></h2><p>As funções são uma forma através da qual podemos estruturar nosso código em sub-rotinas as quais podemos:</p><ol><li>dar um nome</li><li>chamar quando precisamos delas</li></ol><p>Iniciando de seu primeiro programa, um "Hello, World!", você já faz uso de funções em C imediatamente:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    printf("Hello, World!");
}
</code></pre><p>A função <code>main()</code> é muito importante, pois é o ponto de entrada para um programa em C.</p><p>Aqui temos outra função:</p><pre><code class="language-c">void fazerAlgo(int value) {
    printf("%u", value);
}
</code></pre><p>As funções têm quatro aspectos importantes:</p><ol><li>elas têm um nome, então podemos invocá-las ("chamá-las") mais tarde</li><li>elas especificam um valor de retorno</li><li>elas podem ter argumentos</li><li>elas têm um corpo, envolvido por chaves</li></ol><p>O corpo da função é o conjunto de instruções que são executadas sempre que invocamos uma função.</p><p>Se a função não tiver um valor de retorno, você pode usar a palavra-chave <code>void</code> antes do nome da função. Do contrário, especifique o tipo do valor de retorno da função (<code>int</code> para inteiros, <code>float</code> para valores de ponto flutuante, <code>const char *</code> para uma string etc.).</p><p>Você não pode retornar mais de um valor a partir de uma função.</p><p>Uma função pode ter argumentos. Eles são opcionais. Se ela não os tiver, dentro dos parênteses, inserimos <code>void</code>, assim:</p><pre><code class="language-c">void fazerAlgo(void) {
   /* ... */
}
</code></pre><p>Neste caso, quando invocamos a função, a chamamos sem nada entre os parênteses:</p><pre><code class="language-c">fazerAlgo();
</code></pre><p>Se nós temos um parâmetro, especificamos o tipo e o nome do parâmetro, assim:</p><pre><code class="language-c">void fazerAlgo(int valor) {
   /* ... */
}
</code></pre><p>Quando invocamos o nome da função, passamos aquele parâmetro nos parênteses, assim:</p><pre><code class="language-c">fazerAlgo(3);
</code></pre><p>Podemos ter vários parâmetros, e, se tivermos, os separamos usando uma vírgula, na declaração e na invocação:</p><pre><code class="language-c">void fazerAlgo(int valor1, int valor2) {
   /* ... */
}

fazerAlgo(3, 4);
</code></pre><p>Parâmetros são passados por <strong><strong>c</strong>ópia</strong>. Isso significa que, se você modificar <code>valor1</code>, seu valor é modificado localmente. O valor fora da função, onde ele foi passado na invocação, não se altera.</p><p>Se você passar um <strong><strong>po</strong>nteiro</strong> como parâmetro, pode modificar aquele valor de variável, pois agora você pode acessá-la diretamente, usando seu endereço de memória.</p><p>Você não pode definir um valor padrão como parâmetro. O C++ permite isso (assim como os programas na linguagem Arduino), mas o C não.</p><p>Não se esqueça de definir a função antes de chamá-la. Do contrário, o compilador lançará um aviso e um erro:</p><pre><code>➜  ~ gcc hello.c -o hello; ./hello
hello.c:13:3: warning: implicit declaration of
      function 'fazerAlgo' is invalid in C99
      [-Wimplicit-function-declaration]
  fazerAlgo(3, 4);
  ^
hello.c:17:6: error: conflicting types for
      'fazerAlgo'
void fazerAlgo(int valor1, char valor2) {
     ^
hello.c:13:3: note: previous implicit declaration
      is here
  fazerAlgo(3, 4);
  ^
1 warning and 1 error generated.
</code></pre><p>O aviso tem a ver com a ordenação, algo que já mencionei antes.</p><p>O erro tem a ver com outra coisa que está relacionada. Como o C não "vê" a declaração da função antes da invocação, ele deve fazer suposições. Ele, então, supõe que a função retorne <code>int</code>. A função, no entanto, retorna <code>void</code>, que é a razão para o erro.</p><p>Se alterarmos a definição da função para:</p><pre><code class="language-c">int fazerAlgo(int valor1, int valor2) {
  printf("%d %d\n", valor1, valor2);
  return 1;
}
</code></pre><p>receberemos apenas o aviso, não o erro:</p><pre><code>➜  ~ gcc hello.c -o hello; ./hello
hello.c:14:3: warning: implicit declaration of
      function 'fazerAlgo' is invalid in C99
      [-Wimplicit-function-declaration]
  fazerAlgo(3, 4);
  ^
1 warning generated.
</code></pre><p>De qualquer modo, certifique-se de declarar a função antes de usá-la. Mova a função para cima ou adicione o protótipo da função em um arquivo de cabeçalho (em inglês, <em>header</em>).</p><p>Dentro de uma função, é possível declarar variáveis.</p><pre><code class="language-c">void fazerAlgo(int valor) {
  int valorEmDobro = valor * 2;
}
</code></pre><p>Uma variável é criada no ponto de invocação da função e destruída quando a função se encerra. Ela não é visível de fora.</p><p>Dentro de uma função, você pode chamar a própria função. Isso se chama <strong><strong>recurs</strong>ão</strong> e é algo que oferece possibilidades bem peculiares.</p><h2 id="entrada-e-sa-da"><strong>Entrada e saída</strong></h2><p>O C é uma linguagem pequena, e o "núcleo" do C não inclui funcionalidades de entrada/saída (input/output, ou I/O).</p><p>Isso não é exclusivo do C, naturalmente. É comum o núcleo de uma linguagem não depender de I/O.</p><p>No caso do C, a entrada/saída é fornecida para nós por meio da biblioteca padrão &nbsp;(do inglês, <em>standard library)</em> do C por meio de um conjunto de funções definidas no arquivo de cabeçalho <code>stdio.h</code>.</p><p>Você pode importar essa biblioteca usando</p><pre><code class="language-c">#include &lt;stdio.h&gt;
</code></pre><p>na parte superior de seu arquivo em C.</p><p>Essa biblioteca nos fornece, entre muitas outras funções:</p><ul><li><code>printf()</code></li><li><code>scanf()</code></li><li><code>sscanf()</code></li><li><code>fgets()</code></li><li><code>fprintf()</code></li></ul><p>Antes de descrever o que essas funções fazem, eu gostaria de dedicar uns instantes a falar dos <strong><strong>streams</strong> de I/O</strong>.</p><p>Temos três tipos de streams de I/O no C:</p><ul><li><code>stdin</code> (<em>standard input</em>, ou a entrada padrão)</li><li><code>stdout</code> (<em>standard output</em>, ou a saída padrão)</li><li><code>stderr</code> (<em>standard error</em>, ou o erro padrão)</li></ul><p>Com funções de I/O, sempre trabalhamos com streams. Um stream é uma interface de alto nível que pode representar um dispositivo ou um arquivo. DO ponto de vista do C, não faz diferença ler de um arquivo ou ler de uma linha de comando: é um stream de I/O de todo modo.</p><p>Há algo, porém, que se deve ter em mente.</p><p>Algumas funções são projetadas para funcionar com um stream específico, como <code>printf()</code>, que usamos para imprimir caracteres no <code>stdout</code>. Usando seu equivalente mais geral, <code>fprintf()</code>, podemos especificar em qual stream queremos escrever.</p><p>Como eu comecei falando de <code>printf()</code>, vamos apresentá-lo agora.</p><p><code>printf()</code> é uma das primeiras funções que você usará ao aprender programação em C.</p><p>Em sua forma mais simples, você passará a ela uma string literal:</p><pre><code class="language-c">printf("Olá!");
</code></pre><p>e o programa imprimirá o conteúdo da string na tela.</p><p>Você pode imprimir o valor de uma variável. Porém, isso é um pouco mais complicado, pois você precisa adicionar um caractere especial, um <em>placeholder</em>, que muda dependendo do tipo de variável. Por exemplo, usamos <code>%d</code> para um algarismo inteiro decimal com sinal:</p><pre><code class="language-c">int idade = 37;

printf("Tenho %d anos", idade);
</code></pre><p>Podemos imprimir mais de uma variável usando vírgulas:</p><pre><code class="language-c">int idade_ontem = 36;
int idade_hoje = 37;

printf("Ontem, eu tinha %d anos e hoje eu tenho %d", idade_ontem, idade_hoje);
</code></pre><p>Existem outros especificadores de formato, como o <code>%d</code>:</p><ul><li><code>%c</code> para um caractere</li><li><code>%s</code> para um caractere</li><li><code>%f</code> para números de ponto flutuante</li><li><code>%p</code> para ponteiros</li></ul><p>e muito mais.</p><p>Podemos usar caracteres de escape em <code>printf()</code>, como <code>\n</code>, usado para fazer com que a saída adicione uma nova linha.</p><h3 id="scanf-"><strong><code>scanf()</code></strong></h3><p><code>printf()</code> é usada como uma função de saída. Quero apresentar uma função de entrada agora, para podermos dizer que vimos tanto a entrada quanto a saída: <code>scanf()</code>.</p><p>Essa função é usada para obter de um usuário que estiver executando o programa um valor, a partir da linha de comando.</p><p>Primeiro, devemos definir uma variável que conterá o valor que obtemos da entrada:</p><pre><code class="language-c">int idade;
</code></pre><p>Depois, chamamos <code>scanf()</code> com 2 argumentos: o formato (tipo) da variável e o endereço da variável:</p><pre><code class="language-c">scanf("%d", &amp;idade);
</code></pre><p>Se quisermos obter uma string como entrada, devemos lembrar que o nome de uma string é um ponteiro para seu primeiro caractere. Assim, não é necessário o caractere <code>&amp;</code> antes dela:</p><pre><code class="language-c">char nome[20];
scanf("%s", nome);
</code></pre><p>Aqui, vemos um pequeno programa que usa <code>printf()</code> e <code>scanf()</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char nome[20];
  printf("Digite seu nome: ");
  scanf("%s", nome);
  printf("Foi digitado o nome %s", nome);
}
</code></pre><h2 id="escopo-das-vari-veis"><strong>Escopo das variáveis</strong></h2><p>Ao definir uma variável em um programa em C, dependendo de onde você a declarar, ela terá um <strong>es<strong>cop</strong>o</strong> diferente.</p><p>Isso significa que ela estará disponível em alguns lugares, mas não em outros.</p><p>A posição determina 2 tipos de variáveis:</p><ul><li><strong>variáveis g<strong>loba</strong>i<strong>s</strong></strong></li><li><strong>variáveis l<strong>oca</strong>i<strong>s</strong></strong></li></ul><p>Esta é a diferença: uma variável declarada dentro de uma função é uma variável local, assim:</p><pre><code class="language-c">int main(void) {
  int idade = 37;
}
</code></pre><p>Variáveis locais estão acessíveis apenas dentro da função. Quando a função termina, elas deixam de existir. Elas são removidas da memória (com algumas exceções).</p><p>Uma variável definida fora de uma função é uma variável global, como neste exemplo:</p><pre><code class="language-c">int idade = 37;

int main(void) {
  /* ... */
}
</code></pre><p>As variáveis globais estarão acessíveis em qualquer função do programa, estando disponíveis durante toda a execução do programa, até que ele se encerre.</p><p>Já mencionei aqui que as variáveis locais não estão mais disponíveis depois do fim da função.</p><p>A razão é o fato de as variáveis locais serem declaradas na <strong><strong>stack</strong></strong> (em português, pilha) por padrão, a menos que você as aloque explicitamente na <strong>heap</strong> usando ponteiros. Nesse caso, você precisará gerenciar a memória por conta própria.</p><h2 id="vari-veis-est-ticas"><strong>Variáveis estáticas</strong></h2><p>Dentro de uma função, você pode inicializar uma <strong>variável es<strong>t</strong>á<strong>tic</strong>a</strong> usando a palavra-chave <code>static</code>.</p><p>Eu disse "dentro de uma função", pois as variáveis globais são estáticas por padrão, não havendo a necessidade de adicionar a palavra-chave.</p><p>O que é uma variável estática? Uma variável estática é inicializada se nenhum valor inicial for especificado, e retendo o valor em todas as chamadas da função.</p><p>Considere a função a seguir:</p><pre><code class="language-c">int aumentarIdade() {
  int idade = 0;
  idade++;
  return idade;
}
</code></pre><p>Se chamarmos <code>aumentarIdade()</code> uma vez, teremos <code>1</code> como valor de retorno. Se a chamarmos mais de uma vez, receberemos sempre 1 como retorno, pois <code>idade</code> é uma variável local e reinicializada como <code>0</code> em cada chamada de função.</p><p>Se alterarmos a função para:</p><pre><code class="language-c">int aumentarIdade() {
  static int idade = 0;
  idade++;
  return idade;
}
</code></pre><p>Agora, toda vez que chamarmos essa função, teremos um valor aumentado em um:</p><pre><code class="language-c">printf("%d\n", aumentarIdade());
printf("%d\n", aumentarIdade());
printf("%d\n", aumentarIdade());
</code></pre><p>retornará</p><pre><code>1
2
3
</code></pre><p>Também podemos omitir a inicialização de <code>idade</code> como 0 em <code>static int idade = 0;</code> e simplesmente escrever <code>static int idade;</code>, pois variáveis estáticas são definidas automaticamente como 0 ao serem criadas.</p><p>Também podemos ter arrays estáticos. Nesse caso, cada item do array é inicializado com 0:</p><pre><code class="language-c">int aumentarIdade() {
  static int idades[3];
  idades[0]++;
  return idades[0];
}
</code></pre><h2 id="vari-veis-globais"><strong>Variáveis globais</strong></h2><p>Nesta seção, eu gostaria de falar um pouco mais sobre a diferença entre as <strong>variáveis locais e globais</strong>.</p><p>Uma <strong>variável l<strong>ocal </strong></strong>é definida dentro de uma função, estando disponível apenas dentro daquela função.</p><p>Assim:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
  char j = 0;
  j += 10;
  printf("%u", j); //10
}
</code></pre><p><code>j</code> não está disponível em nenhum outro lugar fora da função <code>main</code>.</p><p>Uma <strong>variável g<strong>lobal </strong></strong>é definida fora das funções, assim:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

char i = 0;

int main(void) {
  i += 10;
  printf("%u", i); //10
}
</code></pre><p>Uma variável global pode ser acessada de qualquer função do programa. O acesso não é limitado à leitura do valor: a variável pode ser atualizada a partir de qualquer função.</p><p>Por causa disso, variáveis globais são uma maneira que temos de compartilhar os mesmos dados entre funções.</p><p>A diferença principal delas para as variáveis locais é que a memória alocada para as variáveis é liberada assim que a função se encerra.</p><p>Variáveis globais são liberadas apenas quando o programa se encerra.</p><h2 id="defini-es-de-tipo"><strong>Definições de tipo</strong></h2><p>A palavra-chave <code>typedef</code> em C permite que você defina tipos novos.</p><p>Partindo dos tipos integrados em C, podemos criar nossos próprios tipos, usando a sintaxe abaixo:</p><pre><code class="language-c">typedef tipoExistente NOVOTIPO
</code></pre><p>O novo tipo que criamos, em geral, estará em maiúsculas.</p><p>Isso serve para distingui-lo mais facilmente e para que o reconheçamos imediatamente como um tipo.</p><p>Por exemplo, podemos definir um novo tipo <code>NUMBER</code> como um <code>int</code>:</p><pre><code class="language-c">typedef int NUMBER
</code></pre><p>e, ao fazer isso, podemos definir novas variáveis <code>NUMBER</code>:</p><pre><code class="language-c">NUMBER um = 1;
</code></pre><p>Você pode estar se perguntando: para quê? Por que não usar simplesmente o tipo integrado <code>int</code> em vez disso?</p><p>Bem, <code>typedef</code> passa a ser realmente útil quando associado a outros dois conceitos: tipos enumerados e estruturas.</p><h2 id="tipos-enumerados"><strong>Tipos enumerados</strong></h2><p>Usando as palavras-chave <code>typedef</code> e <code>enum</code>, podemos definir um tipo que pode ter um valor ou outro.</p><p>Esse é um dos usos mais importantes da palavra-chave <code>typedef</code>.</p><p>Esta é a sintaxe de um tipo enumerado:</p><pre><code class="language-c">typedef enum {
  //...valores
} NOME_DO_TIPO;
</code></pre><p>O tipo enumerado que criamos, em geral, por convenção, é em letras maiúsculas.</p><p>Aqui temos um exemplo simples:</p><pre><code class="language-c">typedef enum {
  true,
  false
} BOOLEANO;
</code></pre><p>C já vem com um tipo <code>bool</code>, o que faz com que esse exemplo não seja muito prático, mas você entende a ideia.</p><p>Outro exemplo é para a definição de dias da semana:</p><pre><code class="language-c">typedef enum {
  segunda,  
  terca,
  quarta,
  quinta,
  sexta,
  sabado,
  domingo
} DIA_DA_SEMANA;
</code></pre><p>Aqui temos um programa simples que usa o tipo enumerado acima:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

typedef enum {
  segunda,  
  terca,
  quarta,
  quinta,
  sexta,
  sabado,
  domingo
} DIA_DA_SEMANA;

int main(void) {
  DIA_DA_SEMANA dia = segunda;

  if (dia == segunda) {
    printf("Hoje é segunda!"); 
  } else {
    printf("Hoje não é segunda"); 
  }
}
</code></pre><p>Cada item na definição de <code>enum</code> é pareado a um número inteiro internamente. Assim, nesse exemplo <code>segunda</code> é 0, <code>terca</code> é 1 e assim por diante.</p><p>Isso significa que o condicional poderia ter sido <code>if (dia == 0)</code> em vez de <code>if (dia == segunda)</code>, mas é muito mais simples para nós, seres humanos, entender os nomes do que os números, o que torna essa sintaxe mais conveniente.</p><h2 id="estruturas"><strong>Estruturas</strong></h2><p>Usando a palavra-chave <code>struct</code>, podemos criar estruturas de dados complexas por meio dos tipos básicos em C.</p><p>Uma estrutura é uma coleção de valores de diferentes tipos. Arrays em C são limitados a um tipo, de modo que as estruturas podem se tornar bastante interessantes em muitos casos de uso.</p><p>Aqui vemos a sintaxe de uma estrutura:</p><pre><code class="language-c">struct &lt;nome_da_estrutura&gt; {
  //...variáveis
};
</code></pre><p>Exemplo:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
};
</code></pre><p>Você pode declarar variáveis que tenham como tipo aquela estrutura adicionando-as após a chave de fechamento, antes do ponto e vírgula, assim:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
} flavio;
</code></pre><p>Ou diversas variáveis, assim:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
} flavio, pessoas[20];
</code></pre><p>Nesse caso, eu declaro uma única variável <code>pessoa</code>, chamada <code>flavio</code>, e um array com 20 variáveis do tipo <code>pessoa</code>, chamado <code>pessoas</code>.</p><p>Também podemos declarar variáveis mais tarde, usando essa sintaxe:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
};

struct pessoa flavio;
</code></pre><p>Podemos inicializar uma estrutura no momento da declaração:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
};

struct pessoa flavio = { 37, "Flavio" };
</code></pre><p>e quando tivermos uma estrutura definida, podemos acessar os valores nela usando um ponto:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
};

struct pessoa flavio = { 37, "Flavio" };
printf("%s, idade %u", flavio.nome, flavio.idade);
</code></pre><p>Também podemos alterar os valores usando a sintaxe do ponto:</p><pre><code class="language-c">struct pessoa {
  int idade;
  char *nome;
};

struct pessoa flavio = { 37, "Flavio" };

flavio.idade = 38;
</code></pre><p>As estruturas são muito úteis, pois podemos passá-las como parâmetros de funções ou retornar valores, incorporando diversas variáveis dentro delas. Cada variável tem um rótulo.</p><p>É importante observar que as estruturas são <strong><strong>pass</strong>adas<strong> </strong>por <strong>c</strong>ópia</strong>, a menos que, logicamente, passemos um ponteiro a uma estrutura, caso em que ela é passada por referência.</p><p>Usando <code>typedef</code>, podemos simplificar o código ao trabalhar com estruturas.</p><p>Vejamos um exemplo:</p><pre><code class="language-c">typedef struct {
  int idade;
  char *nome;
} PESSOA;
</code></pre><p>A estrutura que criamos usando <code>typedef</code>, em geral, por convenção, fica em maiúsculas.</p><p>Agora, podemos declarar novas variáveis <code>PESSOA</code> assim:</p><pre><code class="language-c">PESSOA flavio;
</code></pre><p>e podemos inicializá-las no momento da declaração, assim:</p><pre><code class="language-c">PESSOA flavio = { 37, "Flavio" };
</code></pre><h2 id="par-metros-da-linha-de-comando"><strong>Parâmetros da linha de comando</strong></h2><p>Em seus programas em C, você pode precisar aceitar parâmetros a partir da linha de comando quando um comando for executado.</p><p>Para necessidades mais simples, tudo o que você precisa fazer é alterar a assinatura da função <code>main()</code> de</p><pre><code class="language-c">int main(void)
</code></pre><p>para</p><pre><code class="language-c">int main (int argc, char *argv[])
</code></pre><p><code>argc</code> é um número inteiro que contém o número de parâmetros que serão fornecidos na linha de comando.</p><p><code>argv</code> é um array de strings.</p><p>Quando o programa é iniciado, recebemos os argumentos nesses 2 parâmetros.</p><p>Observe que sempre há ao menos um item no array <code>argv</code>: o nome do programa</p><p>Vamos pegar o exemplo do compilador do C que usamos para executar nossos programas, assim:</p><pre><code class="language-sh">gcc hello.c -o hello
</code></pre><p>Se esse fosse o nosso programa, teríamos <code>argc</code> com o valor de 4 e <code>argv</code> sendo um array contendo</p><ul><li><code>gcc</code></li><li><code>hello.c</code></li><li><code>-o</code></li><li><code>hello</code></li></ul><p>Vamos escrever um programa que imprima os argumentos que ele recebe:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main (int argc, char *argv[]) {
  for (int i = 0; i &lt; argc; i++) {
    printf("%s\n", argv[i]);
  }
}
</code></pre><p>Se o nome do nosso programa for <code>hello</code> e se o executarmos assim: <code>./hello</code>, teremos, como resultado:</p><pre><code>./hello
</code></pre><p>Se passarmos alguns parâmetros aleatórios, assim: <code>./hello a b c</code>, teremos o seguinte resultado no terminal:</p><pre><code>./hello
a
b
c
</code></pre><p>Esse sistema funciona muito bem para necessidades simples. Para as mais complexas, existem pacotes usados normalmente, como o <strong><strong>getopt</strong></strong>.</p><h2 id="arquivos-de-cabe-alho-headers-"><strong>Arquivos de cabeçalho (<em>headers</em>)</strong></h2><p>Programas simples podem ser colocados em um único arquivo. Porém, quando seu programa fica muito grande, é impossível mantê-lo inteiramente em um arquivo.</p><p>Você pode mover partes de um programa para um arquivo em separado. Você, então, cria um <strong>arquivo de cabeçalho</strong>.</p><p>Um arquivo de cabeçalho se parece com um arquivo normal em C, exceto pelo fato de terminar com um <code>.h</code> em vez de um <code>.c</code>. No lugar das implementações de suas funções e de outras partes de um programa, ele mantém as <strong><strong>declara</strong>çõe<strong>s</strong></strong>.</p><p>Você já usou arquivos de cabeçalho quando usou pela primeira vez a função <code>printf()</code> ou qualquer outra função de entrada/saída e precisou digitar:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
</code></pre><p>para usá-la.</p><p><code>#include</code> é uma diretiva do pré-processador.</p><p>O pré-processador procura pelo arquivo <code>stdio.h</code> na biblioteca padrão, pois você utilizado os sinais de <code>&lt;</code> e <code>&gt;</code> ao redor dele. Para incluir seus próprios arquivos de cabeçalho, use aspas, assim:</p><pre><code class="language-c">#include "meuArquivo.h"
</code></pre><p>A linha acima procurará por <code>meuArquivo.h</code> na pasta atual.</p><p>Você também pode usar uma estrutura de pastas para as bibliotecas:</p><pre><code class="language-c">#include "minhaPasta/meuArquivo.h"
</code></pre><p>Vejamos um exemplo. O programa a seguir calcula os anos que se passaram desde um determinado ano:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int calcularIdade(int ano) {
  const int ANO_ATUAL = 2022;
  return ANO_ATUAL - ano;
}

int main(void) {
  printf("%u", calcularIdade(1983));
}
</code></pre><p>Vamos supor que eu queira mover a função <code>calcularIdade</code> para um arquivo em separado.</p><p>Criamos, então, um arquivo <code>calcular_idade.c</code>:</p><pre><code class="language-c">int calcularIdade(int ano) {
  const int ANO_ATUAL = 2022;
  return ANO_ATUAL - ano;
}
</code></pre><p>E um arquivo <code>calcular_idade.h</code>, onde colocamos o <em>protótipo da f<em>un</em>ção</em>, que é o mesmo que a função no arquivo <code>.c</code>, exceto pelo corpo;</p><pre><code class="language-c">int calcularIdade(int ano);
</code></pre><p>Agora, no arquivo <code>.c</code> principal, podemos remover a definição da função <code>calcularIdade()</code> e importar <code>calcular_idade.h</code>, o que tornará disponível a função <code>calcularIdade()</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include "calcular_idade.h"

int main(void) {
  printf("%u", calcularIdade(1983));
}
</code></pre><p>Não se esqueça de que, para compilar um programa composto por diversos arquivos, é preciso listar todos eles na linha de comando, assim:</p><pre><code class="language-sh">gcc -o main main.c calculate_age.c
</code></pre><p>Com configurações mais complexas, um Makefile é necessário para informar ao compilador como compilar o programa.</p><h2 id="o-pr-processador"><strong>O pré-processador</strong></h2><p>O pré-processador é uma ferramenta que nos ajuda muito quando programamos em C. Ele é parte do padrão C, assim como a linguagem, o compilador e a biblioteca padrão.</p><p>Ele analisa o nosso programa e garante que o compilador obtém tudo de que precisa antes de dar sequência ao processo.</p><p>O que ele faz, na prática?</p><p>Por exemplo, ele procura todos os arquivos de cabeçalho que você inclui com a diretiva <code>#include</code>.</p><p>Ele também procura todas as constantes que você definiu usando <code>#define</code> e as substitui pelo valor real.</p><p>Esse é só o começo. Eu mencionei essas 2 operações porque elas são as mais comuns. O pré-processador pode fazer isso e muito mais.</p><p>Você percebeu que <code>#include</code> e <code>#define</code> têm um <code>#</code> no começo? Isso é comum para todas as diretivas do pré-processador. Se uma linha começa com <code>#</code>, ela é tratada pelo pré-processador.</p><h3 id="condicionais-1"><strong>Condicionais</strong></h3><p>Algo que podemos fazer é usar condicionais para mudar como nosso programa será compilado, dependendo do valor de uma expressão.</p><p>Por exemplo, podemos verificar se a constante <code>DEBUG</code> é 0:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

const int DEBUG = 0;

int main(void) {
#if DEBUG == 0
  printf("Eu NÃO estou fazendo debugging\n");
#else
  printf("Eu estou fazendo debugging\n");
#endif
}
</code></pre><h3 id="constantes-simb-licas"><strong>Constantes simbólicas</strong></h3><p>Podemos definir uma <strong>constante simbólica</strong>:</p><pre><code class="language-c">#define VALOR 1
#define PI 3.14
#define NOME "Flavio"
</code></pre><p>Quando usamos NOME, PI ou VALOR em nosso programa, o pré-processador substitui o nome das constantes pelo valor antes de executar o programa.</p><p>As constantes simbólicas são muito úteis, pois podemos dar nomes aos valores sem criar variáveis em tempo de compilação.</p><h3 id="macros"><strong>Macros</strong></h3><p>Com <code>#define</code>, também podemos definir uma <strong><strong>macro</strong></strong>. A diferença entre uma macro e uma constante simbólica está no fato de que uma macro pode aceitar um argumento e tipicamente contém código, enquanto uma constante simbólica é um valor:</p><pre><code class="language-c">#define POTENCIA(x) ((x) * (x))
</code></pre><p>Observe os parênteses que cercam os argumentos: essa é uma prática recomendada para evitar problemas quando a macro é substituída no processo de pré-compilação.</p><p>Então, podemos usá-la em nosso código, assim:</p><pre><code class="language-c">printf("%u\n", POTENCIA(4)); //16
</code></pre><p>A grande diferença das funções está no fato de que as macros não especificam o tipo de seus argumentos ou valores de retorno, o que pode ser útil em alguns casos.</p><p>As macros, no entanto, estão limitadas a definições de uma linha.</p><h3 id="if-definido"><strong>If definido</strong></h3><p>Podemos verificar se uma constante simbólica ou uma macro estão definidas usando <code>#ifdef</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#define VALOR 1

int main(void) {
#ifdef VALOR
  printf("O valor está definido\n");
#else
  printf("O valor não está definido\n");
#endif
}
</code></pre><p>Também temos <code>#ifndev</code> para verificar o contrário (se a macro não está definida).</p><p>Também podemos usar <code>#if defined</code> e <code>#if !defined</code> para realizar a mesma tarefa.</p><p>É comum envolver algum bloco de código em um bloco desse modo:</p><pre><code class="language-c">#if 0

#endif
</code></pre><p>para evitar temporariamente que ele seja executado, ou para usar uma constante simbólica DEBUG:</p><pre><code class="language-c">#define DEBUG 0

#if DEBUG
  //código enviado ao compilador
  //apenas se DEBUG não for 0
#endif
</code></pre><h3 id="constantes-simb-licas-predefinidas-que-voc-pode-usar"><strong>Constantes simbólicas predefinidas que você pode usar</strong></h3><p>O pré-processador também define algumas constantes simbólicas que você pode usar, identificadas por duas sublinhas antes e após o nome, incluindo:</p><ul><li><code>__LINE__</code> representa a linha atual no arquivo do código-fonte</li><li><code>__FILE__</code> representa o nome do arquivo</li><li><code>__DATE__</code> representa a data de compilação, no formato <code>Mmm dd aaaa</code></li><li><code>__TIME__</code> representa o tempo de compilação, no formato <code>hh:mm:ss</code></li></ul><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Muito obrigado por ler este manual!</p><p>Espero que ele o inspire a saber mais sobre a linguagem C.</p><p>Para ver mais tutoriais, confira o blog do autor, <a href="https://flaviocopes.com/">flaviocopes.com</a>.</p><p>Envie a ele seus comentários, erratas e opiniões pelo e-mail <a href="mailto:hey@flaviocopes.com">hey@flaviocopes.com</a></p><p>E lembre-se: <a href="https://flaviocopes.com/page/c-handbook/">você pode obter uma versão em PDF e em ePub deste manual do iniciante em C</a></p><p>Você também pode falar com o autor pelo Twitter, em <a href="https://twitter.com/flaviocopes">@flaviocopes</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Manipulação de arquivos em C — como abrir e fechar arquivos e escrever algo neles ]]>
                </title>
                <description>
                    <![CDATA[ Se você já escreveu o programa helloworld em C antes, já sabe o básico sobre entrada e saída (I/O, input/output, em inglês) em um arquivo em C: /* Um arquivo hello world simples em C. */ #include <stdlib.h> // Importar as funções de IO. #include <stdio.h> int main() {  ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/manipulacao-de-arquivos-em-c-como-abrir-e-fechar-arquivos-e-escrever-algo-neles/</link>
                <guid isPermaLink="false">6230f44fcf99cc05000986e2</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Tue, 15 Mar 2022 21:06:12 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/5f9c9d31740569d1a4ca3667.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/file-handling-in-c-how-to-open-close-and-write-to-files/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">File Handling in C — How to Open, Close, and Write to Files</a>
      </p><p>Se você já escreveu o programa <code>helloworld</code> em C antes, já sabe o básico sobre entrada e saída (I/O, input/output, em inglês) em um arquivo em C:</p><pre><code class="language-c">/* Um arquivo hello world simples em C. */
#include &lt;stdlib.h&gt;

// Importar as funções de IO.
#include &lt;stdio.h&gt;

int main() {
    // Este printf é onde toda a mágica do IO de arquivos acontece!
    // Legal, não é?
    printf("Olá, mundo!\n");
    return EXIT_SUCCESS;
}</code></pre><p>A manipulação de arquivos é uma das partes mais importantes na programação. Em C, usamos um ponteiro de estrutura de um tipo de arquivo para declarar um arquivo:</p><pre><code class="language-c">FILE *fp;</code></pre><p>C fornece várias funções integradas para realizar operações básicas de arquivos:</p><ul><li><code>fopen()</code> - criar um arquivo ou abrir um arquivo existente</li><li><code>fclose()</code> - fechar um arquivo</li><li><code>getc()</code> - ler um caractere de um arquivo</li><li><code>putc()</code> - escrever um caractere de um arquivo</li><li><code>fscanf()</code> - ler um conjunto de dados de um arquivo</li><li><code>fprintf()</code> - escrever um conjunto de dados em um arquivo</li><li><code>getw()</code> - ler um número inteiro de um arquivo</li><li><code>putw()</code> - escrever um número inteiro em um arquivo</li><li><code>fseek()</code> - definir a posição em um ponto desejado</li><li><code>ftell()</code> - dar a posição atual no arquivo</li><li><code>rewind()</code> - definir a posição como o ponto inicial</li></ul><h3 id="abrindo-um-arquivo"><strong><strong>Abrindo um arquivo</strong></strong></h3><p>A função <code>fopen()</code> é usada para criar um arquivo ou abrir um arquivo existente:</p><pre><code class="language-c">fp = fopen(const char filename,const char mode);</code></pre><p>Existem vários modos de abertura de um arquivo:</p><ul><li><code>r</code> - abre um arquivo no modo leitura</li><li><code>w</code> - abre ou cria um arquivo de texto no modo de escrita</li><li><code>a</code> - abre um arquivo no modo de inclusão (append)</li><li><code>r+</code> - abre um arquivo nos modos de leitura e escrita</li><li><code>a+</code> - abre um arquivo nos modos de leitura e escrita</li><li><code>w+</code> - abre um arquivo nos modos de leitura e escrita</li></ul><p>Aqui temos um exemplo de leitura de dados de um arquivo e de como escrever nele:</p><pre><code class="language-c">#include&lt;stdio.h&gt;
#include&lt;conio.h&gt;
main()
{
FILE *fp;
char ch;
fp = fopen("hello.txt", "w");
printf("Insira dados");
while( (ch = getchar()) != EOF) {
  putc(ch,fp);
}
fclose(fp);
fp = fopen("hello.txt", "r");

while( (ch = getc(fp)! = EOF)
  printf("%c",ch);
  
fclose(fp);
}</code></pre><p>Você pode estar pensando, "Isso simplesmente imprime texto na tela. Como assim isso é entrada/saída de arquivos?"</p><p>A resposta não é óbvia para começar, precisando de um pouco de compreensão sobre como funciona o sistema UNIX. Em um sistema UNIX, tudo é tratado como um arquivo, ou seja, você pode ler e escrever neles.</p><p>Isso quer dizer que seu método printf, por exemplo, pode ser abstraído como um arquivo, já que tudo o que ele faz é escrever. Também é útil pensar nesses arquivos como streams, pois, como veremos mais tarde, é possível redirecioná-los com o shell.</p><p>O que isso tem a ver com o <code>helloworld</code> e com a entrada/saída de arquivos?</p><p>Ao chamar <code>printf</code>, você está simplesmente escrevendo em um arquivo especial, chamado <code>stdout</code>, abreviação de <strong><strong><strong><strong>standard output</strong></strong></strong></strong> (saída padrão). <code>stdout</code> representa a saída padrão, conforme decidido pelo seu shell, e que, geralmente, é o terminal. Isso explica o motivo de se estar imprimindo na tela.</p><p>Existem duas outras streams (ou seja, arquivo) disponíveis para você, <code>stdin</code> e <code>stderr</code>. <code>stdin</code> representa a entrada padrão <strong>(<strong><strong><strong>standard input</strong></strong>, em inglês)</strong></strong>, que o shell geralmente associa ao teclado. <code>stderr</code> representa a saída de erro padrão <strong>(standard error)</strong>, que o shell geralmente associa ao terminal.</p><h3 id="entrada-sa-da-rudimentar-de-arquivos-ou-como-eu-aprendi-a-montar-os-pipelines"><strong>Entrada/saída<strong> rudimentar de arquivos<strong><strong>, o</strong></strong>u como eu aprendi a montar os pipelines</strong></strong></h3><p>Chega de teoria! Vamos logo escrever o código! O modo mais fácil de se escrever em um arquivo é redirecionar o stream de saída usando a ferramenta de redirecionamento de saída, <code>&gt;</code>.</p><p>Se quiser incluir (<em>append</em>, em inglês), você pode usar <code>&gt;&gt;</code>:</p><pre><code class="language-bash"># Isto terá como saída a tela...
./helloworld
# ...mas isto escreverá em um arquivo!
./helloworld &gt; hello.txt</code></pre><p>Sem surpresas, o conteúdo de <code>hello.txt</code> será</p><pre><code class="language-text">Olá, mundo!</code></pre><p>Vamos supor que há um outro programa chamado <code>greet</code>, semelhante a <code>helloworld</code>, que cumprimenta alguém que tenha um <code>nome</code> que ele recebe:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    // Inicializa um array para guardar o nome.
    char nome[20];
    // Ler uma string e salvá-la em nome.
    scanf("%s", nome);
    // Imprimir a saudação.
    printf("Olá, %s!", nome);
    return EXIT_SUCCESS;
}</code></pre><p>Em vez de ler a partir do teclado, podemos redirecionar <code>stdin</code> para que leia de um arquivo usando a ferramenta <code>&lt;</code>:</p><pre><code class="language-bash"># Escreva um arquivo contendo um nome.
echo Kamala &gt; name.txt
# O comando a seguir lerá um nome do arquivo e o imprimirá com a saudação na tela name from the file and print out the greeting to the screen.
./greet &lt; name.txt
# ==&gt; Olá, Kamala!
# Se você quisesse imprimir a saudação em um arquivo, poderia usar "&gt;".</code></pre><p>Observação: esses operadores de redirecionamento se encontram no <code>bash</code> e em shells semelhantes.</p><h3 id="o-que-ocorre-de-fato"><strong>O que ocorre de fato</strong></h3><p>Os métodos acima somente funcionam com os casos mais básicos. Se quiser fazer coisas maiores e melhores, provavelmente desejará trabalhar com os arquivos de dentro do próprio C em vez de usar o shell.</p><p>Para conseguir isso, use uma função chamada <code>fopen</code>. Ela recebe dois parâmetros de string: o primeiro é o nome do arquivo e o segundo é o modo.</p><p>O modo, basicamente, são as permissões (<code>r</code> para leitura, <code>w</code> para escrita, <code>a</code> para inclusão. Você também pode combiná-los. <code>rw</code>, por exemplo, representaria poder ler e escrever no arquivo. Existem mais modos, mas esses são os mais comumente usados.</p><p>Depois de ter um ponteiro <code>FILE</code>, você pode usar basicamente os mesmos comandos de entrada e saída que já usou, exceto pelo fato de que você precisa adicionar a eles o prefixo <code>f</code> e de que o primeiro argumento será o ponteiro do arquivo. Por exemplo, a versão de arquivo de <code>printf</code> é <code>fprintf</code>.</p><p>Aqui temos um programa chamado <code>greetings</code> (saudações, em inglês), que lê de um arquivo que contém uma lista de nomes e escreve as saudações em um outro arquivo:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    // Cria os ponteiros de arquivos.
    FILE *nomes = fopen("names.txt", "r");
    FILE *saudar = fopen("greet.txt", "w");

    // Conferir se está tudo certo.
    if (!names || !greet) {
        fprintf(stderr, "Erro ao abrir arquivo!\n");
        return EXIT_FAILURE;
    }

    // Hora das saudações!
    char nome[20];
    // Basicamente, siga lendo até não haver mais nada para ler.
    while (fscanf(nomes, "%s\n", nome) &gt; 0) {
        fprintf(saudar, "Olá, %s!\n", nome);
    }

    // Ao chegar ao final, imprima uma mensagem no terminal para informar ao usuário.
    if (feof(nomes)) {
        printf("Saudações concluídas!\n");
    }

    return EXIT_SUCCESS;
}</code></pre><p>Supondo que <code>names.txt</code> contenha os nomes abaixo:</p><pre><code class="language-text">Kamala
Logan
Carol</code></pre><p>Após executar o arquivo <code>greetings</code>, o arquivo <code>greet.txt</code> terá:</p><pre><code class="language-text">Olá, Kamala!
Olá, Logan!
Olá, Carol!</code></pre> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Instruções if...else em C explicadas ]]>
                </title>
                <description>
                    <![CDATA[ O fluxo de código condicional é a capacidade de alterar o modo como um trecho de código se comporta com base em certas condições. Para situações assim, você pode usar instruções if. A instrução if também é conhecida como instrução de tomada de decisão, pois ela faz a tomada de ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/instrucoes-if-else-em-c-explicadas/</link>
                <guid isPermaLink="false">621f4b5dfe38d304f5225e6d</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Wed, 02 Mar 2022 11:34:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/5f9c9da9740569d1a4ca38ef.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/if-statements-in-c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">If...Else Statement in C Explained</a>
      </p><p>O fluxo de código condicional é a capacidade de alterar o modo como um trecho de código se comporta com base em certas condições. Para situações assim, você pode usar instruções <code>if</code>.</p><p>A instrução <code>if</code> também é conhecida como instrução de tomada de decisão, pois ela faz a tomada de decisão com base em determinada condição ou expressão. O trecho de código dentro de uma instrução <code>if</code> é executado se a condição for avaliada como verdadeira. No entanto, o código dentro das chaves é desconsiderado se a condição for avaliada como falsa. Nesse caso, o código após a instrução <code>if</code> (após o que vai entre as chaves) é executado.</p><h3 id="sintaxe-de-uma-instru-o-if"><strong><strong>S</strong>intaxe de uma instrução<strong> <code>if</code></strong></strong></h3><pre><code class="language-text">if (condiçãoDeTeste) {
   // instruções
}</code></pre><h3 id="um-exemplo-simples"><strong>Um exemplo simples</strong></h3><p>Vamos examinar um exemplo na prática:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt;

int main(void) {
    if(true) {
        printf("A instrução é verdadeira!\n");
    }

    return 0;
}</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-text">A instrução é verdadeira!</code></pre><p>Se o código dentro dos parênteses da instrução <code>if</code> for verdadeiro, tudo dentro das chaves também o será e será executado. Neste caso, <code>true</code> avalia como verdadeiro, fazendo com que o código execute a função <code>printf</code>, que imprime uma frase na tela.</p><h3 id="instru-es-if-else"><strong>Instruções <strong><code>if..else</code></strong></strong></h3><p>Em uma instrução <code>if...else</code>, se o código dentro dos parênteses da instrução <code>if</code> for verdadeiro, o código dentro das chaves será executado. Porém, se o que estiver dentro do parênteses da instrução if for falso, todo o código dentro das chaves da instrução <code>else</code> será executado no lugar.</p><p>Logicamente, o exemplo acima não é muito útil, já que <code>true</code> sempre é avaliado como verdadeiro. Vejamos, então, um outro exemplo mais prático:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int n = 2;

    if(n == 3) { // comparando n com 3
        printf("A instrução é verdadeira!\n");
    } 
    else { // se a primeira condição não for verdadeira, execute este trecho de código
        printf("A instrução é falsa!\n");
    }

    return 0;
}</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-text">A instrução é falsa!</code></pre><p>Vemos algumas diferenças importantes aqui. Primeiro, <code>stdbool.h</code> não foi incluído. Não há problema nisso, já que <code>true</code> e <code>false</code> não estão sendo usados como no primeiro exemplo. Em C, como em outras linguagens de programação, você pode usar instruções para que sejam avaliadas como verdadeiras ou falsas em vez de usar os valores booleanos <code>true</code> ou <code>false</code> diretamente.</p><p>Perceba, também, a condição dentro dos parênteses da instrução <code>if</code>: <code>n == 3</code>. Essa condição compara <code>n</code> e o número 3. <code>==</code> é um operador de comparação, um dos vários operadores desse tipo em C.</p><h3 id="if-else-aninhados"><strong><strong><code>if...else</code></strong> aninhados</strong></h3><p>A instrução <code>if...else</code> permite que uma escolha seja feita entre duas possibilidades. Há vezes, no entanto, em que você precisa escolher entre três ou mais possibilidades.</p><p>Por exemplo, a função <em>sign</em> (sinal), na matemática, retorna -1 se o argumento for inferior a zero, +1 se for maior que zero e 0 se o argumento for zero.</p><p>O código abaixo implementa essa função:</p><pre><code class="language-c">if (x &lt; 0)
   sign = -1;
else
   if (x == 0)
      sign = 0;
   else
      sign = 1;</code></pre><p>Como é possível ver, uma segunda instrução <code>if...else</code> está aninhada dentro da instrução <code>else</code> do primeiro bloco de <code>if..else</code>.</p><p>Se <code>x</code> for menor que 0, <code>sign</code> é definido como -1. Se <code>x</code> não for inferior a 0, porém, a segunda instrução <code>if...else</code> é executada. Lá, se <code>x</code> for igual a 0, <code>sign</code> é definido como 0. Do contrário, <code>x</code> é maior que 0, e <code>sign</code> é definido como 1.</p><p>Em vez de instruções <code>if...else</code> aninhadas, os iniciantes geralmente usam uma sequência de instruções <code>if</code>:</p><pre><code class="language-c">if (x &lt; 0) {
   sign = -1;
}
   
if (x == 0) {
   sign = 0;
}
   
if (x &gt; 0) {
   sign = 1;
}</code></pre><p>Embora isso funcione, não é recomendado, já que não é certo que somente uma das instruções (<code>sign = ...</code>) deva ser executada dependendo do valor de <code>x</code>. Também não é muito eficaz – toda vez que o código for executado, todas as três condições serão testadas, mesmo que uma ou duas não precisem ser.</p><h3 id="instru-es-else-if"><strong>Instruções <strong>else...if</strong></strong></h3><p>As instruções <code>else...if</code> são alternativas a uma sequência de instruções <code>if</code>. Considere o código a seguir:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int n = 5;

    if(n == 5) {
        printf("n é igual a 5!\n");
    } 
    else if (n &gt; 5) {
        printf("n é maior que 5!\n");
    }

    return 0;
}</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-text">n é igual a 5!</code></pre><p>Se a condição para a instrução <code>if</code> for avaliada como falsa, a condição para a instrução <code>else...if</code> é verificada. Se a condição dessa instrução for avaliada como verdadeira, o código dentro das chaves da instrução <code>else...if</code> é executado.</p><h3 id="operadores-de-compara-o"><strong>Operadores de c<strong>ompar</strong>ação</strong></h3><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOME DO OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">USO</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">RESULTADO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Igual a</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a == b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>é igual a<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code>, senão é falso</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Diferente de</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a != b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for diferente de<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code>, senão é falso</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Maior que</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &gt; b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for maior que<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code>, senão é falso</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Maior que ou igual a</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &gt;= b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for maior que ou igual a<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code>, senão é falso</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Menor que</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &lt; b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for menor que<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code>, senão é falso</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Menor que ou igual a</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a &lt;= b</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for menor que ou igual a<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code>, senão é falso</td></tr></tbody></table><!--kg-card-end: html--><h2 id="operadores-l-gicos"><strong><strong>Operadores lógicos</strong></strong></h2><p>Podemos querer que um trecho de código seja executado se algo não for verdadeiro ou se duas coisas forem verdadeiras. Para isso, temos os operadores lógicos:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOME DO OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">USO</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">RESULTADO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Não (<code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">!</code>)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">!(a == 3)</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>is<span>&nbsp;</span><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);">não</strong><span>&nbsp;</span>for igual a 3</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">E (<code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">&amp;&amp;</code>)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a == 3 &amp;&amp; b == 6</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for igual a 3<span>&nbsp;</span><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);">e</strong><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code><span>&nbsp;</span>for igual a 6</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;">Ou (<code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">||</code>)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a == 2 || b == 4</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">Verdadeiro se<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">a</code><span>&nbsp;</span>for igual a 2<span>&nbsp;</span><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: var(--darkreader-text--gray85);">ou</strong><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--darkreader-bg--gray15);">b</code><span>&nbsp;</span>for igual a 4</td></tr></tbody></table><!--kg-card-end: html--><p>Por exemplo:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main(void) {
    int n = 5;
    int m = 10;

    if(n &gt; m || n == 15) {
        printf("Ou n é maior que m, ou n é igual a 15\n");
    } 
    else if( n == 5 &amp;&amp; m == 10 ) {
        printf("n é igual a 5 e m é igual a 10!\n");
    } 
    else if ( !(n == 6)) {
        printf("Não é verdade que n seja igual a 6!\n");
    }
    else if (n &gt; 5) {
        printf("n é maior que 5!\n");
    }

    return 0;
}</code></pre><p><strong><strong>Output:</strong></strong></p><pre><code class="language-text">n é igual a 5 e m é igual a 10!</code></pre><h3 id="uma-observa-o-importante-sobre-as-compara-es-em-c"><strong>Uma observação importante sobre as comparações em<strong> C</strong></strong></h3><p>Embora tenhamos mencionado antes que cada comparação está verificando se algo é verdadeiro ou falso, isso é apenas parcialmente verdadeiro. O C é uma linguagem bastante leve e próxima ao hardware que a está executando. Com o hardware. é fácil verificar se algo é 0 ou <em>false</em>, mas qualquer outra coisa fica mais difícil.</p><p>Em vez disso, é muito mais preciso dizer que as comparações são, de fato, uma verificação se algo é 0/<em>false</em>, ou se são algum outro valor diferente.</p><p>Por exemplo, essa instrução if é verdadeira e válida:</p><pre><code class="language-c">if(12452) {
    printf("Isso é verdadeiro!\n")
}</code></pre><p>Por padrão, 0 é <em>false</em>, e, por convenção, 1 é <em>true</em>. De fato, vamos ver a biblioteca <code>stdbool.h</code>:</p><pre><code class="language-c">#define false   0
#define true    1</code></pre><p>Embora sejam um pouco mais do que isso, essa é a lógica central do funcionamento dos booleanos e o modo como as bibliotecas operam. Essas duas linhas instruem o compilador a substituir a palavra <code>false</code> por 0 e a palavra <code>true</code> por 1.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Especificadores de formatação em C ]]>
                </title>
                <description>
                    <![CDATA[ Os especificadores de formatação definem o tipo de dados a ser impresso no resultado padrão. Você precisa usar especificadores de formatação se estiver imprimindo resultado formatado com printf() ou se estiver aceitando uma entrada com scanf(). Alguns dos especificadores % que você pode usar em ANSI C são: ESPECIFICADORUSADO PARA%cum ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/especificadores-de-formatacao-em-c/</link>
                <guid isPermaLink="false">61e2d73b3ca86504f628f57b</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Sat, 15 Jan 2022 14:35:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/01/5f9c9d9c740569d1a4ca38a4.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/format-specifiers-in-c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Format Specifiers in C</a>
      </p><p>Os especificadores de formatação definem o tipo de dados a ser impresso no resultado padrão. Você precisa usar especificadores de formatação se estiver imprimindo resultado formatado com <code>printf()</code> ou se estiver aceitando uma entrada com <code>scanf()</code>.</p><p>Alguns dos especificadores % que você pode usar em ANSI C são:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">ESPECIFICADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">USADO PARA</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%c</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um único caractere</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%s</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">uma string</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%hi</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">short (com sinal)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%hu</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">short (sem sinal)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%Lf</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">long double</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%n</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">sem impressão</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%d</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um inteiro decimal (assume a base 10)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%i</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um decimal inteiro (detecta a base automaticamente)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%o</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um inteiro octal (base 8)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%x</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um inteiro hexadecimal (base 16)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%p</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um endereço (ou pointer)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%f</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um número de ponto flutuante para floats</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%u</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">int decimal sem sinal</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%e</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um número de ponto flutuante em notação científica</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%E</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">um número de ponto flutuante em notação científica</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-size: 20px 100%; background-repeat: no-repeat;">%%</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--darkreader-border--gray10); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">o símbolo %</td></tr></tbody></table><!--kg-card-end: html--><h2 id="exemplos-"><strong><strong>Ex</strong>emplos<strong>:</strong></strong></h2><h3 id="especificador-de-formata-o-de-caractere-nico-c-"><strong>Especificador de formatação de caractere único <strong><code>%c</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char first_ch = 'f'; 
  printf("%c\n", first_ch); 
  return 0; 
} </code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>f</code></pre><h3 id="especificador-de-formata-o-de-string-s-"><strong>Especificador de formatação de string <strong><code>%s</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char str[] = "freeCodeCamp"; 
  printf("%s\n", str); 
  return 0; 
} </code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>freeCodeCamp</code></pre><h3 id="entrada-de-caracteres-com-o-especificador-de-formata-o-c-"><strong>Entrada de caracteres com o especificador de formatação<strong> <code>%c</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char user_ch; 
  scanf("%c", &amp;user_ch); // user inputs Y
  printf("%c\n", user_ch); 
  return 0; 
} </code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>Y</code></pre><h3 id="entrada-de-strings-com-o-especificador-de-formata-o-s-"><strong>Entrada de strings com o especificador de formatação <strong><code>%s</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char user_str[20]; 
  scanf("%s", user_str); // user inputs fCC
  printf("%s\n", user_str); 
  return 0; 
} </code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>fCC</code></pre><h3 id="especificadores-de-formata-o-de-inteiros-decimais-d-e-i-"><strong>Especificadores de formatação de inteiros decimais <strong><code>%d</code> </strong>e<strong> <code>%i</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  int found = 2015, curr = 2020; 
  printf("%d\n", found); 
  printf("%i\n", curr); 
  return 0; 
} </code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>2015
2020</code></pre><h3 id="especificador-de-formata-o-de-n-mero-de-ponto-flutuante-f-e-e-"><strong>Especificador de formatação de número de ponto flutuante <strong><code>%f</code> </strong>e<strong> <code>%e</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() { 
  float num = 19.99; 
  printf("%f\n", num); 
  printf("%e\n", num); 
  return 0; 
}</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>19.990000
1.999000e+01</code></pre><h3 id="especificador-de-formata-o-de-inteiro-octal-o-"><strong>Especificador de formatação de inteiro octal <strong><code>%o</code>:</strong></strong></h3><pre><code>#include &lt;stdio.h&gt; 

int main() { 
  int num = 31; 
  printf("%o\n", num); 
  return 0; 
}</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>37</code></pre><h3 id="especificador-de-formata-o-de-inteiro-hexadecimal-x-"><strong>Especificador de formatação de inteiro hexadecimal <strong><code>%x</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  int c = 28; 
  printf("%x\n", c); 
  return 0; 
} </code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code>1c</code></pre> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Operador ternário em C ]]>
                </title>
                <description>
                    <![CDATA[ Programadores usam o operador ternário para a tomada de decisões no lugar das instruções condicionais de if e else mais extensas. O operador ternário recebe três argumentos:  1. O primeiro é um argumento de comparação  2. O segundo é o resultado caso a comparação seja verdadeira  3. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/operador-ternario-em-c/</link>
                <guid isPermaLink="false">61b789a0f15c8104f2fda0e5</guid>
                
                    <category>
                        <![CDATA[ Linguagem C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Mon, 13 Dec 2021 22:10:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/5f9c9db2740569d1a4ca3922.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/c-ternary-operator/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Ternary Operator in C Explained</a>
      </p><p>Programadores usam o <strong>operador ternário</strong> para a tomada de decisões no lugar das instruções condicionais de <strong><strong>if</strong></strong> e <strong><strong>else</strong></strong> mais extensas.</p><p>O operador ternário recebe três argumentos:</p><ol><li>O primeiro é um argumento de comparação</li><li>O segundo é o resultado caso a comparação seja verdadeira</li><li>O terceiro é o resultado caso ela seja false</li></ol><p>É útil pensar no operador ternário como uma versão abreviada da escrita de uma instrução do tipo if-else. Aqui vemos um exemplo de tomada de decisão simples usando <strong><strong><strong><strong>if</strong></strong></strong></strong> e <strong><strong><strong><strong>else</strong></strong></strong></strong>:</p><pre><code class="language-c">int a = 10, b = 20, c;

if (a &lt; b) {
    c = a;
}
else {
    c = b;
}

printf("%d", c);</code></pre><p>O exemplo tem mais de 10 linhas, mas isso não é necessário. É possível escrever o programa acima em apenas 3 linhas de código usando um operador ternário.</p><h3 id="sintaxe"><strong><strong><strong><strong>S</strong></strong></strong>intaxe</strong></h3><p><code>condição ? valor_se_verdadeiro : valor_se_falso</code></p><p>A instrução avalia o <code>valor_se_verdadeiro</code> se a <code>condição</code> for atendida e o <code>valor_se_falso</code> se não for.</p><p>Aqui vemos o exemplo acima reescrito usando o operador ternário:</p><pre><code class="language-c">int a = 10, b = 20, c;

c = (a &lt; b) ? a : b;

printf("%d", c);</code></pre><p>O resultado do exemplo acima deve ser:</p><pre><code class="language-c">10</code></pre><p><code>c</code> é definido como sendo igual a <code>a</code>, pois a condição <code>a &lt; b</code> é verdadeira.</p><p>Lembre-se de que os argumentos <code>valor_se_verdadeiro</code> e <code>valor_se_falso</code> devem ser do mesmo tipo. Além disso, eles devem ser expressões simples, não instruções completas.</p><p>Os operadores ternários podem ser aninhados, assim como instruções if-else. Considere o código a seguir:</p><pre><code class="language-c">int a = 1, b = 2, ans;
if (a == 1) {
    if (b == 2) {
        ans = 3;
    } else {
        ans = 5;
    }
} else {
    ans = 0;
}
printf ("%d\n", ans);</code></pre><p>Aqui está o código acima reescrito usando um operador ternário aninhado:</p><pre><code class="language-c">int a = 1, b = 2, ans;
ans = (a == 1 ? (b == 2 ? 3 : 5) : 0);
printf ("%d\n", ans);</code></pre><p>O resultado de ambos os códigos acima deve ser:</p><pre><code class="language-c">3</code></pre> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
