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

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

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

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

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

它将针对循环的每次迭代进行评估( 编辑:如果需要 )。

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

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

我有时会将其编码为……

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

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

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

  1. 如果word被声明为常量(数据是常量)
  2. 或者编译器可以检测到该word未被更改。

采用以下示例:

 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

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

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

在那种情况下。 10倍。

阅读更多关于循环

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

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