Pós-incremento e Pós-decremento
Usar ‘++’ ou ‘--’ após um lvalue faz algo peculiar: obtém o valor diretamente do lvalue e, em seguida, o incrementa ou decrementa. Assim, o valor de i++
é o mesmo que o valor de i
, mas i++
também incrementa i
“um pouco depois”. Isso é chamado de pós-incremento ou pós-decremento.
Por exemplo,
imprime linhas contendo 5, novamente 5, e 6. A expressão i++
tem o valor 5, que é o valor de i
naquele momento, mas incrementa i
de 5 para 6 logo em seguida.
O quanto "logo em seguida" acontece? O compilador tem certa flexibilidade para decidir isso. A regra é que o incremento deve ocorrer até o próximo sequence point; em casos simples, isso significa até o final da instrução. Veja .
Independentemente de onde exatamente o código compilado incrementa o valor de i
, o ponto crucial é que o valor de i++
é o valor que i
tinha antes de ser incrementado.
Se um operador unário precede uma expressão de pós-incremento ou pós-decremento, o incremento é aninhado internamente:
Essa é a única ordem que faz sentido; -a
não é um lvalue, então não pode ser incrementado.
O uso mais comum de pós-incremento é com arrays. Aqui está um exemplo de uso de pós-incremento para acessar um elemento de um array e avançar o índice para o próximo acesso. Compare com o exemplo avg_of_double
(veja Um Exemplo com Arrays), que é quase o mesmo, mas não usa pós-incremento.
Atualizado