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

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

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

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

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;
}

所属标签

可能回答问题的人

  • 红双喜经典VS中华

    1 粉丝0 提问8 回答
  • 浮生长恨欢娱少

    个人站长 · 站长 (已认证)

    51 粉丝2 提问4 回答
  • LemonLu

    社区 · 运营 (已认证)

    45 粉丝0 提问4 回答
  • 滑稽园扛把子

    Swoole Inc · PHP工程师 (已认证)

    135 粉丝0 提问4 回答

扫码关注云+社区