Значение s++
является исходным значением s
, до увеличения, приращение происходит в неуказанное время до следующей точки последовательности.
Следовательно *s++
и *(s++)
эквивалентны: они оба разыменовывают исходное значение s
. Другое эквивалентное выражение, *(0, s++)
и, не для слабонервных, таково это:0[s++]
Обратите внимание, что ваша функция должна использовать тип size_t
for 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++
и плохие вещи случатся:)