这是一个计算字符串中字符数的函数:
int str_len(const char* s) {
int i = 0;
while(*(s++)) {
i++;
}
return i;
}
为什么返回正确的长度?
假设我使用简单的String调用此函数"a"
。然后s
递增在while循环,因此值s
和i
均为0。
的值s++
是的原始值s
,在递增之前,递增发生在下一个序列点之前的未指定时间。
因此*s++
和*(s++)
是等效的:它们都取消引用的原始值s
。另一个等效的表达是*(0, s++)
,而不是因为胆小的人,这是这样的:0[s++]
但是请注意,您的函数应将typesize_t
用于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标准。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句