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_t
for i
e 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á:)