2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
1

Если результат функции используется несколько раз то следует ее значение присвоить переменной и использовать переменную?

26.10.2023, 21:14. Показов 548. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если результат функции используется несколько раз, то следует ее значение присвоить переменной и использовать эту переменную?



Как целесообразнее?

Пример 1

Delphi
1
2
for I:=0 to 100000 do
a[I]:= Length('dfdfdfdfdfdfdfsdfdfdsfs');
или

Delphi
1
2
3
с:=  Length('dfdfdfdfdfdfdfsdfdfdsfs');
for I:=0 to 100000 do
a[I]:=с;
Пример 2

Delphi
1
2
3
4
A: = Length('dfdfdfdfdfdfdfsdfdfdsfs');
B: = Length('dfdfdfdfdfdfdfsdfdfdsfs');
C: = Length('dfdfdfdfdfdfdfsdfdfdsfs');
D: = Length('dfdfdfdfdfdfdfsdfdfdsfs');
или

Delphi
1
2
3
4
A: = Length('dfdfdfdfdfdfdfsdfdfdsfs');
B: = A;
C: = A;
D: = A;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2023, 21:14
Ответы с готовыми решениями:

В переменную povtor присвоить результат выполнения функции confirm, которая выводит фразу «Пройти заполнение еще раз?»
В переменную povtor присвоить результат выполнения функции confirm, которая выводит фразу «Пройти...

Вычислить значение функции. В качестве параметров использовать переменную и константы, если они есть
Вычислить значение функции. В качестве параметров использовать переменную и константы, если они...

Переменной А присвоить ее значение, увеличенное в N раз, 2N раз, 3N раз
Переменной А присвоить ее значение, увеличенное в N раз, 2N раз, 3N раз

Переменной k логического типа присвоить значение true в том случае, если массив n целых чисел упорядочен по возрастанию, i значение false если нет
Условие задачи: Переменной k логического типа присвоить значение true в том случае, если массив n...

10
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,991
26.10.2023, 21:54 2
Вообще, да. Но конкретно с Length длина строки хранится в памяти, потому, просто считывается точно так же, как и из переменной. Т.е., с Length не имеет смысла.
0
Злостный нарушитель
9594 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,500
27.10.2023, 09:38 3
Оптимизатор не допустит такого безобразия и сам выделит память под временную переменную.
0
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,392
Записей в блоге: 20
27.10.2023, 10:47 4
еще как допустит)
мне несложно сделать переменную
0
Модератор
9626 / 6237 / 2422
Регистрация: 21.01.2014
Сообщений: 26,628
Записей в блоге: 3
27.10.2023, 11:24 5
Как по мне - лучше объявить одну переменную с не слишком длинным именем, чем тягать постоянно имя функции и 100500 ее параметров...
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
27.10.2023, 12:34 6
Цитата Сообщение от Verevkin Посмотреть сообщение
Оптимизатор не допустит такого безобразия и сам выделит память под временную переменную.
Delphi
1
2
3
4
5
x:=Random(0,100);
lbRnd.Items.Add(x.ToString);
x:=Random(0,100);
lbRnd.Items.Add(x.ToString);
x:=Random(0,100);
Добавлено через 9 минут
Делал я как-то отчет в Excel из Interbase базы с набором в 220 тыс. что ли строк. Считалась там статистика типа среднекв. откл. Все это дело строилось за 17 сек. на тогдашнем P4-3000. И я не подумавши брал в каждом обращении данные через AsFloat и так 6 раз каждое. А потом мне понадобилось добавить еще 1 параметр и пришлось поменять процедурку так, что все эти AsFloat стали передаваться 1 раз при вызове. В результате несмотря на добавление еще 1 листа выводимого в Excel время выполнения упало до 14-15. Ну подумаешь всего-то лишний миллион обращений к методу TIBQuery.AsFloat.
0
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,392
Записей в блоге: 20
27.10.2023, 12:39 7
надеюсь это были FieldByName('xxx').AsFloat ? ))
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
27.10.2023, 13:22 8
Нет, по индексу.
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
27.10.2023, 15:46 9
Цитата Сообщение от S0563506 Посмотреть сообщение
Если результат функции используется несколько раз, то следует ее значение присвоить переменной и использовать эту переменную?
Если не предполагается, что результат функции может внезапно поменяться, то лучше использовать переменную. И отлаживать так проще.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 190
06.11.2023, 09:09  [ТС] 10
Цитата Сообщение от Constcat Посмотреть сообщение
Если не предполагается, что результат функции может внезапно поменяться, то лучше использовать переменную.
Выше у меня немного другие примеры были.

Встречаются еще вот такие варианты. Значение-резултат функции будет одинаков. В обоих вызовах.
Вопрос в том, что мы получим результат функции GetLastModifiedFileDate в сравнении if в первом её вызове, а потом
она снова будет вызвана в Result := GetLastModifiedFileDate(SubFolder, APattern), и снова например будет просматривать скажем вес диск C:?
Или же каким то чудом компилятор поймет, что только что эта функция была вызвана с теми же параметрами и можно ее не запускать снова, а просто взять ранее полученное значение уже из памяти? Компилятор на такое способен или "тупо" как написно будет вызвана два раза процедура и она два раза будет просматривать содержимое директории SubFolder?

Delphi
1
2
3
          if Result < GetLastModifiedFileDate(SubFolder, APattern) then begin
            Result := GetLastModifiedFileDate(SubFolder, APattern);
          end;
Или правильнее сделать так:
Delphi
1
2
3
4
ATime := GetLastModifiedFileDate(SubFolder, APattern); 
          if Result < ATime  then begin
            Result := ATime ;
          end;
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.11.2023, 10:46 11
Цитата Сообщение от S0563506 Посмотреть сообщение
Или же каким то чудом компилятор поймет, что только что эта функция была вызвана с теми же параметрами и можно ее не запускать снова, а просто взять ранее полученное значение уже из памяти?
Нет, компилятор таким не занимается.
Оптимизация производится, если компилятор видит, что задействованные компоненты (параметры/данные) никак не зависят от каких-то внешних изменений. Т.е., выражение "2+3" компилятор заменит на "5" и "впишет" этот результат в бинарный код.
Цитата Сообщение от S0563506 Посмотреть сообщение
и снова например будет просматривать скажем вес диск C:?
Да, будет просматривать. Тем более, что это - файловая система, которая не зависит от вашей программы. Между вызовами этой функции там много чего может поменяться.

Но в вашем примере лучше использовать переменную. Выражением
Delphi
1
ATime := GetLastModifiedFileDate(SubFolder, APattern);
вы получаете некий "срез" информации на текущий момент, который и нужно вернуть в Result
А иначе вы получите одно, а вернуть можете совсем другое.
0
06.11.2023, 10:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2023, 10:46
Помогаю со студенческими работами здесь

Как использовать одну и ту же переменную несколько раз в одном коде
подскажите как использовать одну и туже переменную несколько раз в одном коде допустим А

Присвоить переменной результат отработки функции
Ребят привет! Не получается присвоить переменной результат отработки функции. я проверяю наличие в...

Возможно ли несколько раз использовать указатель на результат выполнения запроса?
Пример: $query = mysqli_query($db, &quot;SELECT id, name, link FROM cat&quot;); $query2 = $query; ...

Присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном случае
Имеется символьная переменная d, присвоить логической переменной T значение true, если значение...

а если присвоить переменной а значение переменной н,то если изменится в ходе исполнения программы н,а изменится?
а если присвоить переменной а значение переменной н,то если изменится в ходе исполнения программы...

Написать программу, которая позволяет переменной a присвоить значение 0, если число четное, и 1, если — нечетное
В памяти по некоторому адресу хранится натуральное число. Написать программу, которая позволяет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru