O valor de s++é o valor original de s, antes do incremento, o incremento ocorre em um tempo não especificado antes do próximo ponto de sequência.
Daí *s++e *(s++)são equivalentes: ambos desreferenciam o valor original de s. Outra expressão equivalente é *(0, s++)e, não para os fracos de coração, é esta:0[s++]
Observe, no entanto, que sua função deve usar type size_tfor ie seu tipo de retorno:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
Aqui está uma versão potencialmente mais eficiente com um único incremento por loop:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
Para aqueles que se perguntam sobre as expressões estranhas no segundo parágrafo:
0, s++é uma instância do operador de vírgula ,que avalia sua parte esquerda e depois a parte direita, que constitui seu valor. portanto, (0, s++)é equivalente a (s++).
0[s++]é equivalente a (s++)[0]e *(0 + s++)ou *(s++ + 0)que simplifica como *(s++). Transpor o ponteiro e as expressões de índice em []expressões não é muito comum nem particularmente útil, mas está em conformidade com o padrão C.
, s++coisas ruins e acontecerá:)