i++ vs ++i em C

Jinku Hu 12 outubro 2023
  1. Principais diferenças entre ++i e i++ Notas em C
  2. Utilize a notação ++i como Estilo Comummente Aceito para Declarações em Laço em C
i++ vs ++i em C

Este artigo explicará vários métodos de utilização de operadores de incremento de prefixo vs operadores de incremento de posfixo, também conhecido por i++ vs ++i, em C.

Principais diferenças entre ++i e i++ Notas em C

A parte fundamental destas duas notações é o operador de incremento unário ++ que aumenta o seu operando, por exemplo i, em 1. O operador de incremento pode vir antes do operando como prefixo ++i ou depois do operando como operador pós-fixo - i++.

Um comportamento ligeiramente invulgar surge quando o valor da variável incrementado com o operador ++ é utilizado numa expressão. Neste caso, os incrementos de prefixo e postfixos comportam-se de forma diferente. Nomeadamente, o operador de prefixo incrementa o seu operando antes de o seu valor ser utilizado, enquanto que o operador de prefixo incrementa o operando depois de o valor ter sido utilizado.

Como resultado, a função printf que utiliza a expressão i++ como argumento imprimirá o valor de i antes de ser incrementado por um. Por outro lado, a função printf com operador de incremento de prefixo ++i imprimirá o valor incremental, que será 1 na primeira iteração, como demonstrado no seguinte código de exemplo.

#include <stdio.h>
#include <stdlib.h>

int main() {
  int i = 0, j = 0;

  while ((i < 5) && (j < 5)) {
    /*
    postfix increment, i++
    the value of i is read and then incremented
    */
    printf("i: %d\t", i++);
    /*
    prefix increment, ++j
    the value of j is incremented and then read
    */
    printf("j: %d\n", ++j);
  }

  printf("At the end they have both equal values:\ni: %d\tj: %d\n\n", i, j);

  exit(EXIT_SUCCESS);
}

Resultado:

i: 0	j: 1
i: 1	j: 2
i: 2	j: 3
i: 3	j: 4
i: 4	j: 5
At the end they have both equal values:
i: 5	j: 5

Utilize a notação ++i como Estilo Comummente Aceito para Declarações em Laço em C

Os operadores de prefixos e de postfixos têm o mesmo comportamento funcional quando utilizados na declaração de loop for. Como as duas iterações for são executadas no código de amostra abaixo, imprimem os valores de k de forma idêntica.

Note-se que existem várias alegações sobre a melhor eficiência de desempenho da utilização do incremento de prefixo sobre o prefixo nos loops for, mas a diferença de tempo efectiva na maioria das aplicações será negligenciável. Podemos adquirir o hábito de utilizar o operador de prefixo como o método preferido como um estilo comummente aceite.

Mas se já estiver a utilizar a notação de prefixo, então considere que a utilização de compiladores modernos com as correspondentes bandeiras de optimização eliminará automaticamente as iterações ineficientes dos loops.

#include <stdio.h>
#include <stdlib.h>

int main() {
  for (int k = 0; k < 5; ++k) {
    printf("%d ", k);
  }
  printf("\n");
  for (int k = 0; k < 5; k++) {
    printf("%d ", k);
  }
  printf("\n\n");

  exit(EXIT_SUCCESS);
}

Resultado:

0 1 2 3 4
0 1 2 3 4
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C Operator