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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

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

for (int i = 0; i < strlen(ss); ++i)
{
    // blabla
}

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

提问于
用户回答回答于

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

我会做类似的事情

for (int i = 0, n = strlen(ss); i < n; ++i)

或可能

for (int i = 0; ss[i]; ++i)

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

用户回答回答于

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

char str[30];
for ( int i = 0; str[i] != '\0'; i++)
{
//Something;
}

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

在下面的代码中,每次循环运行时strlen都会计算整个字符串的效率较低,需要更多时间并占用更多内存。

char str[];
for ( int i = 0; i < strlen(str); i++)
{
//Something;
}

扫码关注云+社区