Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Operadores de Incremento (++) e Decremento (--) - Diferença entre a=b++ e a=++b

Antes de iniciarmos nossos estudos sobre os laços, o curso C Progressivo irá apresentar algumas ferramentas que serão úteis e bastante utilizadas.

São operadores matemáticos que facilitarão nossas vidas de programador C, e que iremos usar diversas vezes em nossa apostila online.


Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!


Contando em linguagem C

Em muitas aplicações C precisamos contar, ou controlar coisas:

  • quantas teclas foram digitadas
  • quantas vidas você ainda tem em jogo
  • quanto tempo se passou
  • quantos visitantes o site C Progressivo recebeu
  • etc.

Até agora, temos contado de um em um. Imagine, gerenciar e contar um sistema de cadastro com milhões de inscritos, como o do Enem?

Ainda bem que você é programador C e não se assustou, pois sabe que não vai fazer isso, e sim seu escravo: o computador.
Lembre-se: a relação do programador C com a máquina não é de usuário, e sim de mestre para escravo. Com C, você domina tudo o que ocorre com seu computador.

Então, boa parte das contas são feitas utilizando os 'laços', que ensinaremos bem em breve e vai utilizar para sempre.
Com ele, você vai fazer com que o computador faça o tanto de contas que quiser...10, 20, mil, 1 milhão...o Google realiza trilhões por dia.
Você pode até fazer um looping infinito e travar seu computador. Uns chamam de hackear, eu prefiro chamar de estudo e vou mostrar como fazer.

Esses laços, porém, tem que ser incrementado. Geralmente eles tem um início, uma condição e um fim.
Como esse fim é atingido? Através de uma ou mais variável que vão crescendo ou diminuindo, ou através de expressões lógicas.
Quando se atinge um certo ponto, o laço vai parar.

É aí que entra os operadores de incremento e decremento.



Somando e Subtraindo variáveis em C

O incremento em uma unidade quer dizer:
a = a + 1

a = a + 1, em C, é algo totalmente diferente da Matemática convencional.
Vamos ver na prática, que depois explico.

Façamos isso em um aplicativo em C:
a=1;
a = a + 1;
Logo após atribuir 1 ao 'a', imprima, veja o resultado e tente descobrir o que aconteceu.
Substitua por: a = a + 2;
Ou a = a + 3;

#include <stdio.h>

int main()
{
        int a=1;

        printf("a = %d\n", a);
        a = a + 1;
        printf("a = %d\n", a);

}



Hackers são pessoas que descobrem as coisas sozinhas (e não criminosos ou vândalos, como é difundido), fazem isso.
Testam, pensam e descobrem como as coisas funcionam.

Explicação:
Quando fazemos a =
é porque vamos atribuir um valor ao 'a', um novo valor, INDEPENDENTE do que ele tinha antes.
E qual o valor que vamos atribuir? 'a + 1'!
Ou seja, o 'a' vai ser agora o seu antigo valor mais 1!

Se a=2, e fazemos a = a + 3, o que estamos fazendo?
Estamos dizendo que o 'a' vai mudar, vai ser seu antigo valor (2), mais 3! Ou seja, agora a=5
Faz sentido, não?

a++ e a--
Usaremos muito, mas MUITO mesmo o incremento e o decremento de unidade:
a = a + 1;
a = a - 1;

Porém, é chato ou da preguiça ficar escrevendo a=a+1 e a=a-1 o tempo inteiro.
Então, inventaram atalhos para isso!
a = a + 1 pode ser representado por a++ ou ++a
a = a - 1 pode ser representado por a-- ou --a

Existe uma diferença entre a-- e --a, ou entre a++ e ++a, que vamos explicar no próximo tópico.
E como já dizia o filósofo: só creio compilando e vendo.

#include <stdio.h>

int main()
{       int a=1,
            b=1;

        printf("Valor inicial de a = %d\n", a);
        printf("Valor inicial de b = %d\n", b);

        printf("\nIncrementando: a++\n");
        a++;

        printf("Decrementando: b--\n");
        b--;

        printf("\nAgora a = %d\n", a);
        printf("Agora b = %d\n",b);

}


Diferença entre os operadores entre a=++b e a=b++

Já vimos o uso dos operadores de decremento e incremento, em C.

Você ja estudou e testou que usar isoladamente:
a++ e ++a não surte efeito.

Porém, surte na hora da atribuição.

Vamos lá, ao nosso 'teste hacker':
Seja b=2;
Só olhando e raciocinando, você seria capaz de descobrir quanto seria 'a' em cada caso:
a = b++;
a = ++b;

Explicações
1. a = b++

Isso é apenas um atalho em C, uma forma mais simples de escrever as seguintes linhas:
a = b;
b++;

2. a = ++b
Analogamente, é o atalho que usamos em C para representar as seguintes linhas de código:
++b;
a = b;


Em ambos os casos, 'b' é incrementado. A diferença é que 'a' recebe o valor de 'b' antes do incremento em um e depois do incremento em outro. Não precisa decorar nada, é só analisar a lógica das coisas e verá que tudo faz sentido na linguagem C.
Veja:

No primeiro exemplo: a = b++
O que vem primeiro, 'b' ou incremento? Primeiro o 'b'. Depois o de incremento ocorre, '++'.
Ou seja, 'a' vai receber o valor de 'b' primeiro, então a=2
Só depois que 'b' vai ser incrementado e vai se tornar b=3.

No segundo exemplo: a = ++b
O que vem primeiro? 'b' ou incremento?
Primeiro o incremento, '++', depois que aparece o 'b', então só depois acontece a atribuição..
Assim, primeiro ocorre o incremente, então b=3.
Só depois é que esse valor é atribuído para a.

Como diria o véio deitado: compilais e verás a verdade.
Eis o código:


#include <stdio.h>

int main()
{
        int a,
            b=1;

        printf("b = %d\n",b);
        printf("a = b++\n");

        a = b++;

        printf("\nAgora: \na = %d\n",a);

        printf("b = %d\n",b);
        printf("\na = ++b\n");

        a = ++b;

        printf("\nAgora: a = %d",a);
}

6 comentários:

Marcelo Araújo disse...

Olá amigos,
Por que neste programa b-- não ficou igual a zero?

#include

int main()
{ int a=1,
b=1;

printf("Valor inicial de a = %d\n", a);
printf("Valor inicial de b = %d\n", b);

printf("\nIncrementando: a++\n");
a++;

printf("Decrementando: b--\n");
b--;

printf("\nAgora a = %d\n", a);
printf("Agora b = %d\n",b);

}

Evandro Caetano disse...

Rodei o programa e deu b=0 somente faltou a biblioteca

Unknown disse...

No meu rodou de boa, deu a=2 e b=0

Anônimo disse...

Alguem me explica qual é o motivo de a ser 8 no inicio?.Obrigado.Otimo site

Unknown disse...

obrigado!

Fabio disse...

Queria ajuda para resolver uma questão de concurso:

Na linguagem de programação C, cadeias de caracteres (ou Strings) são representadas por vetores do tipo char. O código abaixo chama uma função denominada apresentarString, que imprime o conteúdo da String armazenada em vet.

int main()
{
char vet[100] = "Eu sou uma String!";
apresentarString(vet);
return 0;
}

Qual dos códigos abaixo é capaz de imprimir corretamente a String "Eu sou uma String!" :

A)
void apresentarString(char * str) {
if (*str == '\0') {
return;
}
printf("%c", *str);
apresentarString(str++);
}

ou

B)
void apresentarString(char * str) {
if (*str == '\0') {
return;
}
printf("%c", *str);
apresentarString(++str);
}