为什么此函数返回正确的字符串长度?(增加一个char指针)

这是一个计算字符串中字符数的函数:

int str_len(const char* s) {
    int i = 0;
    while(*(s++)) {
        i++;
    }
    return i;
}

为什么返回正确的长度?

假设我使用简单的String调用此函数"a"然后s递增在while循环,因此值si均为0。

chqrlie

的值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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一个char指针函数在函数内部返回字符串,但在main函数中返回字符串?

为什么此请求返回一个空字符串?

为什么我的函数返回一个空字符串?

为什么打印指向char的指针的第一个元素会打印字符串的内容?

为什么此bash函数仅打印整个字符串的第一个单词?

为什么此函数返回''而不是串联字符串

一个带有字符串参数并返回整数指针的函数

创建一个接受枚举变量并返回字符串指针的函数

为什么在 C++ 中将字符串和 char 连接起来会返回一个空字符串?

为什么在for循环中第二次运行函数会返回一个空字符串?

为什么在C中有一个指向字符串数组的指针

为什么此定义返回一个函数?

当我将一个char添加到空字符串(如“” + c)时,为什么返回一个未知值?

为什么此运行代码不打印字符串的最后一个值 /?

使用printf(“%s”,..)打印结构,该结构的第一个变量类型是'char *',为什么可以获取存储在'char *'中的正确字符串?

该函数接受一个char数组并返回一个串联的字符串。哈斯克尔

从字符串数组中返回一个长度等于输入整数的字符串

实现一个C函数,该函数在给定字符上拆分字符串,并在拆分后返回字符串数组(以及数组长度)

为什么我对WinGetTitle的调用返回一个空字符串?

为什么 'Date()' 返回一个字符串?

为什么 req.query.code 返回一个空字符串?

为什么在RestController中,Flux.fromIterable()作为一个串联字符串返回?

为什么getenv()返回一个非常量字符串

为什么nextLine()返回一个空字符串?

为什么 Promise 返回一个空字符串?

为什么Spring Boot返回一个字符串而不是JSON

为什么json_encode返回一个空字符串

为什么 React Native 返回一个等价于布尔值的字符串?

为什么SUM(`column`)返回一个字符串而不是整数?