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

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

for (i = 0; i < strlen(word); i++)
{ /* do stuff */ }
12
задан Noldorin 12 January 2010 в 14:18
поделиться

6 ответов

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

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

28
ответ дан 2 December 2019 в 03:25
поделиться

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

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

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

8
ответ дан 2 December 2019 в 03:25
поделиться

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

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

Подробнее о петле

0
ответ дан 2 December 2019 в 03:25
поделиться

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

for (i = 0, j = strlen(word); i < j i++)
{ /* do stuff */ }
0
ответ дан 2 December 2019 в 03:25
поделиться

Это не будет работать, я боюсь, поскольку две лямбда-выражения (и делегаты), которые вы объявили, на самом деле разные объекты, и возвращает разные ссылки. Следовательно, удаление обработчика ( - = ) всегда будет терпеть неудачу.

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

-121--1019982-

Количество раз Sllen (Word) выполняется зависит от:

  1. , если Word объявляется как постоянный (данные постоянны)
  2. или компилятор может обнаружить, что Слово не изменено.

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

char word[256] = "Grow";

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

В этом примере переменная Word модифицируется с циклом:
0) «расти» - длина == 4
1) «Расти *» - длина == 5
2) «Расти **» - Длина == 6

Однако компилятор может факторировать вызов , поэтому он называется один раз, если переменная слово Объявленные как постоянные:

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

Функция заявила, что переменное слово является постоянным данным (фактически указатель на постоянные данные ). Таким образом, длина не изменится, поэтому компилятор может звонить только STRLEN один раз.

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

2
ответ дан 2 December 2019 в 03:25
поделиться

Я иногда код, как ...

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

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

6
ответ дан 2 December 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: