这是C语言!它被设计成简洁明了的语言!
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语言中,如果表达式的结果是非零值,则为“true”,如果结果为零,则为“false”。
*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
循环的结束。