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