在for循环中会调用strlen()多少次?

时间:2010-01-12 14:10:36

标签: c loops

下面的strlen()函数是否只被调用一次(存储的值用于进一步比较);或者每次进行比较时都会调用它?

for (i = 0; i < strlen(word); i++)
{ /* do stuff */ }

6 个答案:

答案 0 :(得分:28)

这是依赖于实现的。通常,它每次都被调用,但是,如果编译器可以看到word永远不会改变,并且strlen是纯函数(没有副作用),它可以解除调用。

请参阅:http://underhanded.xcott.com/?page_id=15,了解有关此漏洞的一个众所周知的示例。 : - )

答案 1 :(得分:8)

将对循环的每次迭代进行评估(编辑:如有必要)。

像Tatu所说,如果word的长度不会改变,你可以在for循环之前进行strlen调用。但正如克里斯所说,编译器可能已经足够好,意识到word无法改变,并且消除了重复的调用本身。

但是如果word在循环期间可以改变长度,那么当然你需要将strlen调用保持在循环条件中。

答案 2 :(得分:6)

我有时会将其编码为......

for (int i = 0, n = strlen(word); i < n; ++i) { /* do stuff */ }

...所以strlen只被调用一次(以提高性能)。

答案 3 :(得分:1)

执行strlen(word)的次数取决于:

  1. 如果word被声明为常量(数据是常量)
  2. 或者编译器可以检测到它 word未被更改。
  3. 采用以下示例:

    char word[256] = "Grow";
    
    for (i = 0; i < strlen(word); ++i)
    {
      strcat(word, "*");
    }
    

    在此示例中,使用循环修改变量word
    0)“成长” - 长度== 4
    1)“成长*” - 长度== 5
    2)“成长**” - 长度== 6

    但是,编译器可以分解strlen调用,因此如果变量word被声明为常量,则调用一次:

    void my_function(const char * word)
    {
      for (i = 0; i < strlen(word); ++i)
      {
         printf("%d) %s\n", i, word);
      }
      return;
    }
    

    该函数声明变量word是常量数据(实际上,指向常量数据的指针)。因此,长度不会改变,因此编译器只能调用strlen一次。

    如果有疑问,您可以随时自行执行优化,在这种情况下可能会提供更易读的代码。

答案 4 :(得分:0)

strlen检查提供的字符串的长度。这意味着如果长度是10.只要我低于10,你的迭代就会继续。

在那种情况下。 10次​​。

Read more about loops

答案 5 :(得分:0)

每次迭代都会调用它。以下代码只调用一次strlen函数。

for (i = 0, j = strlen(word); i < j i++)
{ /* do stuff */ }