Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
1

расчёт значений переменных

07.12.2012, 10:54. Показов 648. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!Возник вопрос касательно перерасчета переменных в цикле.
Допустим, у нас есть код
C++
1
2
string mas;
for(int i=0;i<mas.size();i++)
Будет ли программа на каждой итерации цикла переасчитывать значение mas.size() или компилятор это оптимизирует это както.Или же всё же будет лучше записать так:
C++
1
2
3
string mas;
int j=mas.size();
for(int i=0;i<j;i++)

Та же ситуация и касательно простых выражений.Как лучше записывать:
C++
1
2
int n;
for(int i=0;i<n-1;i++)
или же так
C++
1
2
3
int n;
int j=n-1;
for(int i=0;i<j;i++)
Распишите пожалуйста поподробнеее данную тему.Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2012, 10:54
Ответы с готовыми решениями:

Расчёт значений по формулам
Программа для расчёта Y и Z по формулам. Исходные данные вводятся с клавиатуры. Также найти...

Неправильный расчёт значений массива в ф-ции
Здравствуйте! Помогите пожалуйста! Нужно написать програму используя шаблон ф-ций(для типов int,...

Расчёт значений двумерного массива и их возврат в main() с однократным вызовом функции
Добрый день. Пусть некоторая функция f(a,b,...) производит расчет и записывает данные в...

Расчёт площади для парковки авто (тип авто, площадь, расчёт средней общей)
Расчёт площади для парковки авто (тип авто, площадь, расчёт средней общей). Помогите...

6
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
07.12.2012, 11:12 2
Не совсем удачный пример, но:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <ctime>
class C{
public:
    C(){_size=20;}
    int size(){std::cout<<"\treturn size\n"; return _size;}
private:
    int _size;
};
 
int main(){
    C c;
    for(int i=0;i<c.size();++i);
    int n=100;
    int a=50;
    clock_t start,finish;
    start=clock();
    for(int l=0;l<10;++l)
        for(int i=0;i<n*n;++i)
            for(int j=0;j<n*n;++j)
                a=j*10;
    finish=clock();
    std::cout<<"Time 1: "<<finish-start<<std::endl;
    n=100*100;
    start=clock();
    for(int l=0;l<10;++l)
        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                a=j*10;
    finish=clock();
    std::cout<<"Time 2: "<<finish-start<<std::endl;
    std::cin.get();
    return 0;
}
0
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
07.12.2012, 16:26  [ТС] 3
Croessmah, не могли бы вы поподробнее обьяснить.А то честно говоря, не совсем понимаю...
0
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
07.12.2012, 16:33 4
Относительно функции, будет на каждой итерации вызывать функцию size. Я считаю, что второй вариант предпочтительней.
Относительно второй ситуации нет ни какой разницы, есть разница в том как ты оформляешь код и как удобней тебе и тем людям, кто будет его смотреть.
0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
07.12.2012, 17:29 5
Написал вот такой код для теста:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
 
class Test
{
public:
    Test():_size(25){}
    int size();
private:
    int _size;
};
 
int Test::size()
{
    return _size;
}
 
class Test2
{
public:
    Test2(int x):_size(x){}
    int size();
private:
    int _size;
};
 
int Test2::size()
{
    return _size;
}
 
int main()
{
    Test test;
    for(int i=0; i < test.size(); i++)
        std::cout<<i<<std::endl;
 
    Test2 test2(15);
 
    for(int i=0; i < test2.size(); i++)
        std::cout<<i<<std::endl;
 
    int x = 0;
    std::cin>>x;
 
    for(int i=0; i < x-1; i++)
        std::cout<<i<<std::endl;
 
 
    int z = 0;
    std::cin>>z;
    Test2 tst2(z);
 
    for(int i=0; i < tst2.size(); i++)
        std::cout<<i<<std::endl;
 
    std::string s;
    std::getline(std::cin, s);
    
    for(int i=0; i < s.size(); i++)
        std::cout<<i<<std::endl;
    }


В итоге во всех случаях компилятор вынес вычисление из цикла. Т.е. там где константа (известна на момент компиляции) - подставил константу. Там, где значение не известно - вычислил до входа в цикл (VS2012, ICC).
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
07.12.2012, 17:32 6
Цитата Сообщение от David Sylva Посмотреть сообщение
Относительно второй ситуации нет ни какой разницы, есть разница в том как ты оформляешь код и как удобней тебе и тем людям, кто будет его смотреть.
а как же вычисление n-1 на каждой итерации цикла?
0
David Sylva
07.12.2012, 17:34     расчёт значений переменных
  #7

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
а как же вычисление n-1 на каждой итерации цикла?
Согласен, тупанул.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2012, 17:34

Хранение значений переменных.
Доброго времени суток. Интересует такой вопрос... Вот я имею к примеру 2 глобальные переменные p и...

Хранение значений переменных
Доброго времени суток, есть код: int a = 35; const char b = 'a'; int *p = new int; *p = 25;...

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

Просмотр значений переменных
Пожскажите, как в Visual Studio 2010 открыть watches: окно, где показываются значения переменных на...


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

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

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