c - *str 和 *str++

标签 c pointers char

我有这段代码(我的 strlen 函数)

size_t slen(const char *str)
{
    size_t len = 0;
    while (*str)
    {
        len++;
        str++;
    }
    return len;
}

while (*str++),如下图,程序执行时间要大很多:

while (*str++)
{
    len++;
}

我这样做是为了探测代码

int main()
{
    double i = 11002110;
    const char str[] = "long string here blablablablablablablabla"
    while (i--)
        slen(str);

    return 0;
}

在第一种情况下,执行时间约为 6.7 秒,而在第二种情况下(使用 *str++),时间约为 10 秒!

为什么差别这么大?

最佳答案

可能是因为后递增运算符(在 while 语句的条件中使用)涉及保留变量的临时副本及其旧值。

while (*str++) 的真正含义是:

while (tmp = *str, ++str, tmp)
  ...

相比之下,当您将 str++; 作为 while 循环主体中的单个语句编写时,它处于 void 上下文中,因此不会获取旧值,因为它不需要。

总而言之,在 *str++ 的情况下,您在循环的每次迭代中都有一个赋值、2 个增量和一个跳转。在另一种情况下,您只有 2 个增量和一个跳跃。

关于c - *str 和 *str++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6180311/

相关文章:

c++ - 如何制作 char 的拷贝而不是 C++ 中的引用

c - 是否可以确定符号是 C 中的变量还是函数?

c - getopt 没有正确处理错误

c# - 如何通过一次写入操作用单个值填充整个数组指针?

c++ - 继承多态函数调用

c - 分配一个字符指针数组

c - 有没有办法使用 CUPS API 来保留打印作业?

c - 我已经定义了我的函数,但仍然收到找不到定义的错误

C++ 来自同一个原始指针的多个唯一指针

c++ - char* 和 char[] 数组错误