首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果在循环条件下使用,strlen会被计算多次吗?

如果在循环条件下使用,strlen会被计算多次吗?
EN

Stack Overflow用户
提问于 2012-07-06 23:18:53
回答 13查看 8.1K关注 0票数 113

我不确定下面的代码是否会导致冗余计算,或者它是特定于编译器的?

代码语言:javascript
复制
for (int i = 0; i < strlen(ss); ++i)
{
    // blabla
}

每次i增加都会计算strlen()吗?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2012-07-06 23:24:32

是的,strlen()将在每次迭代中进行评估。在理想情况下,优化器可能能够推断出值不会改变,但我个人不会依赖这一点。

我会做像这样的事情

代码语言:javascript
复制
for (int i = 0, n = strlen(ss); i < n; ++i)

或者有可能

代码语言:javascript
复制
for (int i = 0; ss[i]; ++i)

只要字符串在迭代过程中不会改变长度。如果可能,那么您需要每次都调用strlen(),或者通过更复杂的逻辑来处理它。

票数 143
EN

Stack Overflow用户

发布于 2012-07-06 23:31:10

是的,每次你使用循环的时候。然后它每次都会计算字符串的长度。所以像这样使用它:

代码语言:javascript
复制
char str[30];
for ( int i = 0; str[i] != '\0'; i++)
{
//Something;
}

在上面的代码中,每次循环开始时,str[i]只在位置i处验证字符串中的一个特定字符,因此它占用的内存更少,效率更高。

有关详细信息,请参阅此Link

在下面的代码中,每次循环运行时,strlen都会计算整个字符串的长度,这会降低效率,耗费更多的时间和内存。

代码语言:javascript
复制
char str[];
for ( int i = 0; i < strlen(str); i++)
{
//Something;
}
票数 14
EN

Stack Overflow用户

发布于 2012-07-06 23:23:27

一个好的编译器可能不会每次都计算它,但我不认为你可以肯定,每个编译器都会计算它。

除此之外,编译器必须知道,strlen(ss)不会改变。只有当for循环中的ss未更改时,才会出现这种情况。

例如,如果在for循环中对ss使用只读函数,但没有将ss-parameter声明为const,编译器甚至无法知道ss在循环中没有变化,并且必须在每次迭代中计算strlen(ss)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11365039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档