lor*_*lor 12 c while-loop strlen c89
这是一个计算字符串中字符数的函数:
int str_len(const char* s) {
int i = 0;
while(*(s++)) {
i++;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
为什么这会返回正确的长度?
假设我用一个简单的 String 调用这个函数"a"。然后s递增在while循环,因此值s和i均为0。
chq*_*lie 11
的值s++是 的原始值s,在增量之前,增量发生在下一个序列点之前的未指定时间。
因此*s++和*(s++)是等价的:它们都取消引用 的原始值s。另一个等效的表达式是*(0, s++)and,不适合胆小的人,这是这样的:0[s++]
但是请注意,您的函数应该使用 type size_tfori及其返回类型:
size_t str_len(const char *s) {
size_t i = 0;
while (*s++) {
i++;
}
/* s points after the null terminator */
return i;
}
Run Code Online (Sandbox Code Playgroud)
这是一个可能更高效的版本,每个循环只有一个增量:
size_t str_len(const char *s) {
const char *s0 = s;
while (*s++) {
/* nothing */
}
return s - 1 - s0;
}
Run Code Online (Sandbox Code Playgroud)
对于那些对第二段中奇怪的表达感到疑惑的人:
0, s++是逗号运算符的一个实例,,它评估其左侧部分,然后评估构成其值的右侧部分。因此(0, s++)等价于(s++)。
0[s++]等价于(s++)[0]and*(0 + s++)或*(s++ + 0)简化为*(s++)。在[]表达式中转置指针和索引表达式不是很常见也不是特别有用,但符合 C 标准。
假设我用一个简单的字符串“a”来调用这个函数。然后 s 在 while 循环中递增,因此 s 的值为 0,i 也为 0。
在该示例中,s指向'a'in "a"。然后它被增加并且i也被增加。现在s指向空终止符,并且i是1。因此,在循环的下一次运行中,*(s++)is '\0'(即0),因此循环结束,并返回i(即1)的当前值。
通常,循环对字符串中的每个字符运行一次,然后在空终止符处停止,这就是它计算字符的方式。
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |