El valor de s++es el valor original de s, antes del incremento, el incremento ocurre en un tiempo no especificado antes del siguiente punto de secuencia.
Por lo tanto *s++y *(s++)son equivalentes: ambos desreferencian el valor original de s. Otra expresión equivalente es *(0, s++)y, no para los débiles de corazón, tal es esta:0[s++]
Sin embargo, tenga en cuenta que su función debe usar type size_tfor iy su 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;
}
Aquí hay una versión potencialmente más eficiente con un solo incremento por ciclo:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
Para aquellos que se preguntan sobre las expresiones extrañas en el segundo párrafo:
0, s++es una instancia del operador de coma ,que evalúa su parte izquierda, luego su parte derecha que constituye su valor. por lo tanto, (0, s++)es equivalente a (s++).
0[s++]es equivalente a (s++)[0]y *(0 + s++)o *(s++ + 0)que se simplifica como *(s++). La transposición del puntero y las expresiones de índice en []expresiones no es muy común ni particularmente útil, pero se ajusta al estándar C.
, s++y sucederán cosas malas:)