Сколько раз будет вызываться 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 */ }