Incremento e Decremento Pré e Pós Fixados

por Fabio A. Mazzarino

O conceito é simples, mas muita gente não sabe. A diferença básica entre os operadores de incremento pré-fixados e pós-fixados é o momento em que os valores são resolvidos. No caso dos pré-fixados a execução do incremento/decremento se dá antes da resolução do resultado; no pós-fixado o incremento/decremento se dá depois da resolução do resultado. Assim, o código abaixo:

int x = 10;
int y = 10;
printf("Antes do pre-fixado: %d\n", x);
printf("Durante o pre-fixado: %d\n", ++x);
printf("Apos o pre-fixado: %d\n", x);

printf("Antes do pos-fixado: %d\n", y);
printf("Durante o pos-fixado: %d\n", y++);
printf("Apos o pos-fixado: %d\n", y);

Teremos a seguinte saída:

Antes do pre-fixado:    10
Durante pre-fixado:     11
Apos pre-fixado:        11
Antes do pos-fixado:    10
Durante pos-fixado:     10
Apos pos-fixado:        9

Note o incremento do segundo printf (Durante pre-fixado), o incremento pré-fixado é executando antes de ser resolvido e enviado para o printf, assim o valor impresso é 11. Já no quinto printf (Durante pos-fixado), a resolução do valor é feita antes do decremento, assim o valor passado para o printf é 10, e somente no próximo printf (Apos póx-fixado) o valor decrementado é exibido.

A utilização dos operadores de incremento e decremento pré-fixados e pós-fixados sempre pode ser feita de outra forma, sem utilizar suas funcionalidades de precedência. Por conta dessa funcionalidades algumas equipes de desenvolvimento não aceitam a utilização da procedência para pré e pós fixados.

Como exemplo podemos citar dois trechos de código abaixo:

unsigned strlen_pos(char* s) {
        unsigned n = 0;
        for (; *s++; n++) ;
        return n;
}
unsigned strlen_(char *s) {
        unsigned n = 0;
        for (; *s != '\x0'; n++, s++) ;
        return n;
}

Ambos os trechos de código tem a mesma funcionalidade, retornam o tamanho da string terminada em zero. Note que em ambas as funções o ponteiro s é alterado, sem alterar a string original, uma vez que o atributo não é passado por referência.