Сколько раз будет вызываться strlen() в цикле for?

Будет ли функция strlen() ниже вызываться только один раз (со значением, сохраненным для дальнейших сравнений); или он будет вызываться каждый раз, когда выполняется сравнение?

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

Ответы

Ответ 1

Это зависит от реализации. Обычно он вызывается каждый раз, но если компилятор может видеть, что word никогда не изменяется, а strlen - чистая функция (без побочных эффектов), она может поднять вызов.

См. http://underhanded.xcott.com/?page_id=15 для известного примера использования этого объекта.: -)

Ответ 2

Он будет оцениваться для каждой итерации цикла (edit: при необходимости).

Как сказал Тату, если word не будет меняться по длине, вы можете сделать вызов strlen перед циклом for. Но, как сказал Крис, компилятор может быть достаточно хорош, чтобы понять, что word не может измениться и устранить повторяющиеся вызовы.

Но если word может меняться по длине во время цикла, то, конечно, вам нужно будет поддерживать вызов strlen в условии цикла.

Ответ 3

Я иногда кодирую это как...

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

... так что strlen вызывается только один раз (для повышения производительности).

Ответ 4

Выполняется количество раз strlen(word), зависит от:

  • Если word объявляется константой (данные постоянны)
  • Или компилятор может обнаружить, что word не изменяется.

Возьмем следующий пример:

char word[256] = "Grow";

for (i = 0; i < strlen(word); ++i)
{
  strcat(word, "*");
}

В этом примере переменная word изменяется с помощью цикла:
0) "Рост" - длина == 4
1) "Grow *" - length == 5
2) "Grow **" - длина == 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 один раз.

Если вы сомневаетесь, вы всегда можете самостоятельно выполнить оптимизацию, которая может представить в этом случае более читаемый код.

Ответ 5

strlen проверяет длину предоставленной строки. Это означает, что если длина равна 10. Ваша итерация будет продолжаться, пока я ниже 10.

И в этом случае. 10 раз.

Подробнее о циклах

Ответ 6

Он будет вызываться для каждой итерации. Следующий код только вызывает функцию strlen один раз.

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