Значение s++является исходным значением s, до увеличения, приращение происходит в неуказанное время до следующей точки последовательности.
Следовательно *s++и *(s++)эквивалентны: они оба разыменовывают исходное значение s. Другое эквивалентное выражение, *(0, s++)и, не для слабонервных, таково это:0[s++]
Обратите внимание, что ваша функция должна использовать тип size_tfor iи тип возвращаемого значения:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
Вот потенциально более эффективная версия с одним шагом на цикл:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
Для тех, кто интересуется странными выражениями во втором абзаце:
0, s++является экземпляром оператора запятой, ,который оценивает его левую часть, а затем правую часть, которая составляет его значение. следовательно (0, s++)эквивалентно (s++).
0[s++]эквивалентно (s++)[0]и *(0 + s++)или или *(s++ + 0)которые упрощают как *(s++). Транспонирование указателя и индексных выражений в []выражениях не очень распространено и не особенно полезно, но соответствует стандарту C.
, s++и плохие вещи случатся:)