我有这个代码(我的strlen函数)
size_t slen(const char *str)
{
size_t len = 0;
while (*str)
{
len++;
str++;
}
return len;
}
Run Code Online (Sandbox Code Playgroud)
这样做while (*str++),如下图所示,程序执行时间为大得多:
while (*str++)
{
len++;
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了探测代码
int main()
{
double i = 11002110;
const char str[] = "long string here blablablablablablablabla"
while (i--)
slen(str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,执行时间约为6.7秒,而在第二种情况下(使用*str++),时间约为10秒!
为什么这么大的差异?
可能是因为后增量运算符(在while语句的条件中使用)涉及使用旧值保留变量的临时副本.
什么while (*str++)真正的意思是:
while (tmp = *str, ++str, tmp)
...
Run Code Online (Sandbox Code Playgroud)
相比之下,当您str++;在while循环体中作为单个语句编写时,它处于void上下文中,因此不会获取旧值,因为它不是必需的.
总而言之,*str++如果你有一个赋值,2个增量,并在循环的每次迭代中跳转.在另一种情况下,您只有2个增量和一个跳跃.