Это С! Он создан для краткости!
int count_chars(const char* string, char ch)
{
int c = 0;
while (*string) c += *(string++) == ch;
return c;
}
Обновление
Я попытаюсь объяснить, как это работает:
int c = 0;
Это будет количество найденных совпадений.
while (*string)
Это оператор управления циклом, который будет повторять цикл до тех пор, пока выполняется условие. В этом случае условие *string
. В C строки хранятся с нулевым окончанием, что означает, что последний символ строки - это символ со значением 0 ('\ 0'). *string
вычисляет символ, на который указывает указатель. Выражения в C имеют значение «истина», если они оценивают любое ненулевое значение, и «ложь», если они оцениваются как ноль. *string
является выражением, поэтому любой ненулевой символ, на который указывает *string
, имеет значение true, а '\ 0' в конце строки - false. Так что это прекратится, если *string
указывает на конец строки.
*(string++)
Это выражение, которое оценивает значение, на которое указывает указатель. ++
- это постинкремент, поэтому значение указателя перемещается на одно место вперед, то есть оно указывает на следующий символ в строке. Обратите внимание, что значение выражения не совпадает со значением *string
после того, как выражение было оценено, поскольку указатель сместился.
*(string++) == ch
Это выражение сравнения, оно сравнивает значение *string
(до его обновления) со значением ch
. В C результатом этого является целое число (в C нет типа bool), которое имеет значение «1», если выражение истинно, и «0», если выражение ложно.
c += *(string++) == ch;
Мы знаем, что бит после +=
равен «1», если символ тот, который мы ищем, и «0», если нет. +=
является сокращением для:
c = c + (*(string++) == ch);
, поэтому счет будет увеличиваться, если найден соответствующий символ.
В данном конкретном случае преимущество синтаксиса +=
невелико, но если бы c
было более сложным, скажем, *(variable [index].structure_member [index2])
, то он был бы оценен только один раз.
;
в конце отмечает конец оператора и, поскольку после while
нет {
, он также отмечает конец цикла while
.