Будет ли функция strlen() ниже вызываться только один раз (со значением, сохраненным для дальнейших сравнений); или он будет вызываться каждый раз, когда выполняется сравнение?
for (i = 0; i < strlen(word); i++)
{ /* do stuff */ }
Будет ли функция strlen() ниже вызываться только один раз (со значением, сохраненным для дальнейших сравнений); или он будет вызываться каждый раз, когда выполняется сравнение?
for (i = 0; i < strlen(word); i++)
{ /* do stuff */ }
Это зависит от реализации. Обычно он вызывается каждый раз, но если компилятор может видеть, что word
никогда не изменяется, а strlen
- чистая функция (без побочных эффектов), она может поднять вызов.
См. http://underhanded.xcott.com/?page_id=15 для известного примера использования этого объекта.: -)
Он будет оцениваться для каждой итерации цикла (edit: при необходимости).
Как сказал Тату, если word
не будет меняться по длине, вы можете сделать вызов strlen
перед циклом for. Но, как сказал Крис, компилятор может быть достаточно хорош, чтобы понять, что word
не может измениться и устранить повторяющиеся вызовы.
Но если word
может меняться по длине во время цикла, то, конечно, вам нужно будет поддерживать вызов strlen
в условии цикла.
Я иногда кодирую это как...
for (int i = 0, n = strlen(word); i < n; ++i) { /* do stuff */ }
... так что strlen вызывается только один раз (для повышения производительности).
Выполняется количество раз 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
один раз.
Если вы сомневаетесь, вы всегда можете самостоятельно выполнить оптимизацию, которая может представить в этом случае более читаемый код.
strlen проверяет длину предоставленной строки. Это означает, что если длина равна 10. Ваша итерация будет продолжаться, пока я ниже 10.
И в этом случае. 10 раз.
Он будет вызываться для каждой итерации. Следующий код только вызывает функцию strlen один раз.
for (i = 0, j = strlen(word); i < j i++)
{ /* do stuff */ }