Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Как по-русски обозвать целиком эту конструкцию? - C++

23.05.2012, 13:37. Просмотров 1002. Ответов 28
Метки нет (Все метки)

Ту что в круглых скобках в операторе for?
C++
1
2
3
4
for (i=0; i<n; ++i)
{
 cout<<i;
}
В фигурных скобках - тело, вся первая строка - заголовок. А то, что в круглых скобках целиком, но без самого оператора for? Я циклом пользоваться умею, мне нужна только формулировка, как он пишется.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 13:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как по-русски обозвать целиком эту конструкцию? (C++):

Как обозвать эту величину? - C++
switch (c). Как обозвать величину c? Семантику её я знаю, меня интересует именно как она называется.

Как прописать строки по- русски - C++
Как прописать строки по-русски, чтобы при выводе на экран не было иероглифов?

Как это читается по-русски - C++
int MyFunc(...) { cout&lt;&lt;MyFunc; //это //cout&lt;&lt;MyFunc //это return 0; } int main() { MyFunc(100);

Как избежать такую конструкцию? - C++
#include &lt;iostream&gt; #include &lt;vector&gt; class Foo { public: Foo() { x = 0; }

Помогите создать конструкцию как экспортируемую функцию shared DLL - C++
Я пишу на VB, но по некоторым причинам в VB невозможно реализовать необходимую мне конструкцию. И я прошу Вас помочь мне создать эту...

Как по-русски обозвать назначение члена? - C++ WinAPI
typedef struct _CONSOLE_SELECTION_INFO { DWORD dwFlags; COORD dwSelectionAnchor; SMALL_RECT srSelection; }...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 16:03 #16
Честно признаюсь, я тоже больше люблю декремент.) Но почти им не пользуюсь, логика работы и не позволяет.(

Добавлено через 46 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
А в этом варианте перебирается не массив.
А что именно перебирается при помощи индекса, если это не массив?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 16:34  [ТС] #17
Цитата Сообщение от Deviaphan Посмотреть сообщение
А если они не зависят друг от друга, то добро пожаловать в жестокий мир многопроцессорного программирования.
Например,
C++
1
2
3
4
5
6
7
8
9
10
11
12
for (i=0; i<9; ++i)
{
 for (j=i+1; j<10; ++j)
 {
  if (a[i]>a[j])
  {
   t=a[i];
   a[i]=a[j];
   a[j]=t;
  }
 }
}
и
C++
1
2
3
4
5
6
7
8
9
10
11
12
for (i=9; i>0; --i)
{
 for (j=i-1; j>=0; --j)
 {
  if (a[j]>a[i])
  {
   t=a[i];
   a[i]=a[j];
   a[j]=t;
  }
 }
}
эквивалентны, но параллелизма не терпят. Можно перевернуть и Гаусса, и определитель матрицы и произведение матриц. Если цикл не занимается вводом/выводом, или последовательным доступом (например, к линейному списку), то можно перевернуть и зависимость. Даже в авторасписании бывают перевернутые циклы. А если ты в конкретном случае не можешь перевернуть зависимость, то счастливо отвлечься на изучение математических дебрей.

Добавлено через 8 минут
Цитата Сообщение от Deviaphan Посмотреть сообщение
А что именно перебирается при помощи индекса, если это не массив?
Телом цикла может быть второй цикл и оба вместе могут решать уравнение каким нибудь методом последовательного приближения, тогда внешний цикл перебирает не индекс, а абстрактный счётчик. По идее счёткчик в этом случае не нужен, там должен быть цикл с постусловием достижения некоторого значения невязки, но на него вешают защиту от затягивния в виде составного условия повторения, ложного не только при малой невязке, но и при превышении заданного числа итераций. У меня таких циклов было по шесть штук на проект и крутились они часами.

Добавлено через 11 минут
Ну и, наконец, самый тупой вариант - поиск определённого по счёту элемента линейного списка.
C++
1
2
3
4
5
6
int & larray::operator [] (unsigned int index)
{
 int *p;
 for (p=start, ++index; (index>0)&&(p->next=NULL); p=p->next, --index);
 return *p;
}
Ну и факториал, конечно,:
C++
1
2
3
4
5
6
7
8
9
int factorial(unsigned int x)
{
 int r=1;
 for (; i>0; --i)
 {
  r*=i;
 }
 return r;
}
. Случаи, когда сравнение трогать нельзя, в контексте его оптимизации не рассматриваются. Но там инкремент/декремент врядли не примерно по ровну.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 17:57 #18
Продолжим толстый троллинг.
В чём, с точки зрения оптимизации, разница между j<10 и j>=0 ?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 18:08  [ТС] #19
Цитата Сообщение от Deviaphan Посмотреть сообщение
В чём, с точки зрения оптимизации, разница между j<10 и j>=0 ?
Даже если не учитывать загрузку лишнего операнда, либо необходимость занять один лишний регистр, сравнение с нолём само по себе быстрей.

Добавлено через 4 минуты
А в случае факториала ещё и избавляемся от лишних операций инициализации специальной величины-счётчика, отведения под неё памяти (r то будет сразу в eax) и освобождения её при завершении функции. Да и в других функциях можно выкрутиться подобным же образом, если параметр сразу равен одному из пределов цикла. И с тем же результатом.

Добавлено через 1 минуту
И тролят здесь меня, упорно уводя от вопроса о наименовании содержимого круглых скобок.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 18:39 #20
Цитата Сообщение от taras atavin Посмотреть сообщение
Даже если не учитывать загрузку лишнего операнда, либо необходимость занять один лишний регистр, сравнение с нолём само по себе быстрей.
1. Что за лишний операнд? Почему ты так уверен в том, что сгенерирован код с использованием test? А ведь этот оператор вызван быть не может, т.к. уловие >=, а не =, поэтому в любом случае будет использовано обычное сравнение. Возможно, что вместо загрузки константы 0 будет использовано xor регистра.
2. соответственно и лишнего регистра нет, т.к. даже 0 придётся загружать в регистр
3. С какой стати сравнение с нулём быстрее?

Цитата Сообщение от taras atavin Посмотреть сообщение
И тролят здесь меня
Потому я и сказал "продолжаем толстый троллинг". Ну нельзя твой вопрос воспринимать всерьёз. И ответить не стебаясь невозможно в принципе.


Цитата Сообщение от taras atavin Посмотреть сообщение
А в случае факториала
Щяс вообще поржём и потроллим знатно.
Привожу два листинга. Код на С++, и сгенерированный ассемблерный код. Я там выделю интересные моменты вот так ****************

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
__declspec(noinline) int factorial(unsigned int i)
{
    int r=1;
    for (; i>0; --i)
    {
        r*=i;
    }
    return r;
}
 
__declspec(noinline) int factorial2(unsigned int i)
{
    int r=1;
    for (int x = 1; x <= i; ++x)
    {
        r*=x;
    }
    return r;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    int f1 = factorial( 10 );
 
    std::cout << f1 << std::endl;
    
    
    int f2 = factorial2(10);
    std::cout << f2 << std::endl;
 
    return 0;
}
Assembler
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.40219.01 
 
    TITLE   T:\r\r\r.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat
 
INCLUDELIB OLDNAMES
 
EXTRN   @__security_check_cookie@4:PROC
EXTRN   __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z:PROC
EXTRN   __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z:PROC
EXTRN   __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z:PROC
EXTRN   __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A:BYTE
PUBLIC  ?factorial2@@YAHI@Z             ; factorial2
; Function compile flags: /Ogtp
; File t:\r\r\r.cpp
;   COMDAT ?factorial2@@YAHI@Z
_TEXT   SEGMENT
?factorial2@@YAHI@Z PROC                ; factorial2, COMDAT
 
; 20   :    int r=1;
; 21   :    for (int x = 1; x <= i; ++x)
; 22   :    {
; 23   :        r*=x;
; 24   :    }
; 25   :    return r;
 
;***************************************************************************************************
;  Вот это весь код, который описывает реализацию факториала с инкрементом
;  Компилятору хватило мозгов всё вычислить в compile-tme
;  Всего дона операция - помещение результата в регистр EAX
    mov eax, 3628800                ; 00375f00H
;***************************************************************************************************
; 26   : }
 
    ret 0
?factorial2@@YAHI@Z ENDP                ; factorial2
_TEXT   ENDS
PUBLIC  ?factorial@@YAHI@Z              ; factorial
; Function compile flags: /Ogtp
;   COMDAT ?factorial@@YAHI@Z
_TEXT   SEGMENT
?factorial@@YAHI@Z PROC                 ; factorial, COMDAT
 
; 9    : {
 
; **************************************************************************************************
;  Код с декрементом.
;  Суммарно 22 операции
    mov ecx, 10                 ; 0000000aH
 
; 10   :    int r=1;
 
    mov eax, 1
    npad    6
$LL3@factorial:
 
; 11   :    for (; i>0; --i)
; 12   :    {
; 13   :        r*=i;
 
    imul    eax, ecx
    dec ecx
    jne SHORT $LL3@factorial
;****************************************************************************************************
; 14   :    }
; 15   :    return r;
; 16   : }
 
    ret 0
?factorial@@YAHI@Z ENDP                 ; factorial
_TEXT   ENDS
PUBLIC  _wmain
; Function compile flags: /Ogtp
;   COMDAT _wmain
_TEXT   SEGMENT
_argc$ = 8                      ; size = 4
_argv$ = 12                     ; size = 4
_wmain  PROC                        ; COMDAT
 
; 31   : 
; 32   :    int f1 = factorial( 10 );
; 33   : 
; 34   :    std::cout << f1 << std::endl;
 
    mov eax, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z
    push    eax
    call    ?factorial@@YAHI@Z          ; factorial
    mov ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    push    eax
    call    DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
    mov ecx, eax
    call    DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z
 
; 35   :    
; 36   :    
; 37   :    int f2 = factorial2(10);
; 38   :    std::cout << f2 << std::endl;
 
    mov ecx, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z
    push    ecx
    call    ?factorial2@@YAHI@Z         ; factorial2
    mov ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    push    eax
    call    DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
    mov ecx, eax
    call    DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z
 
; 39   : 
; 40   :    return 0;
 
    xor eax, eax
 
; 41   : }
 
    ret 0
_wmain  ENDP
_TEXT   ENDS
END
Как говорится, не пытайтесь перехитрить компилятор.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 18:53  [ТС] #21
Совсем уж направление цикла он не меняет, а замена сравнения с числом на вычитание с последующим сравнением с нолём - это тормоза, возвращающиеся через окно. Так что речь не о том, что его надо перехитрить, а о том, что можно вручную облегчить ему задачу. А он иногда и может соптимизировать до сравнения с нолём циклы вида
C++
1
for (i=N; i>=1; --i)
, так не особо и важно, кто заменит i>=1 на i>0, сама же оптимизация та же.

Добавлено через 2 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
от это весь код, который описывает реализацию факториала с инкрементом
; *Компилятору хватило мозгов всё вычислить в compile-tme
; *Всего дона операция - помещение результата в регистр EAX
Ну и ну! Всё посчитать на этапе компиляции? Ты серьёзно? А если
C++
1
2
cin>>n;
cout<<factorial(n);
? Лепим таблицу? Не всегда это разумно.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 18:56 #22
Цитата Сообщение от taras atavin Посмотреть сообщение
А он иногда и может соптимизировать до сравнения с нолём циклы вида
Ты прочитал, что я пометил в *****************?
Вариант с инкрементом компилятор САМОСТОЯТЕЛЬНО высчитал в процессе компиляции и просто вписал в код результат. Цикл заменился на помещение в регистр константы. Всё! Оптимальнее некуда.


Цитата Сообщение от taras atavin Посмотреть сообщение
кто заменит i>=1 на i>0, сама же оптимизация та же
Тогда уж давай удалим лишний цикл и напишем цифру 2.)

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Всё посчитать на этапе компиляции?
Я привёл для конкретного примера со статическим заданием числа. Этот пример разбил твоё утверждение о том, что декремент эффективнее.
С неизвестным числом код не столь красивый, не спорю.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 18:58  [ТС] #23
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ты прочитал, что я пометил в *****************?
Вариант с инкрементом компилятор САМОСТОЯТЕЛЬНО высчитал в процессе компиляции и просто вписал в код результат. Цикл заменился на помещение в регистр константы. Всё! Оптимальнее некуда.
Когда аргумент один и известен на этапе компиляции, то функция не нужна вовсе, можно заранее почитать и вручную подставить готовое значение. А если сам аргумент получаем в рантайме? Так что читать не умеешь ты.

Добавлено через 1 минуту
Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда уж давай удалим лишний цикл и напишем цифру 2.)
Кто сказал, что именно 2? И почему он вдруг лишний?

Добавлено через 52 секунды
Цитата Сообщение от Deviaphan Посмотреть сообщение
Я привёл для конкретного примера со статическим заданием числа. Этот пример разбил твоё утверждение о том, что декремент эффективнее.
С неизвестным числом код не столь красивый, не спорю.
Этот пример не имеет смысла, так как функции для этого вообще не предназначены. Функция нужна, когда её параметры заранее не известны, а тогда её нельзя свести к константе.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 19:01 #24
Цитата Сообщение от taras atavin Посмотреть сообщение
Кто сказал, что именно 2? И почему он вдруг лишний?
Это сказали законы математики. Умножать на 1 не рационально.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Этот пример не имеет смысла, так как функции для этого вообще не предназначены.
Ну ка поясни, что в примере не так? И как сделать, чтобы в нём был смысл?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 19:05  [ТС] #25
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это сказали законы математики. Умножать на 1 не рационально.
Ты про факториал двойки что ли?
C++
1
2
3
4
for (/*начальное n==10*/; n>0; --n)
{
 r*=n;
}
на самом деле r==3628800, заменяем на 2 и получаем 2. Умножение на 1 и на все числа от 1 до 10 - далеко не одно и то же. Почему ты думаешь, что все циклы лишние? Из математики это не следует.

Добавлено через 1 минуту
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну ка поясни, что в примере не так? И как сделать, чтобы в нём был смысл?
То, что ты заменил функцию переменной функцией константы, которая сама есть константа. Из-за одного значения функции не пишут.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 19:07 #26
Цитата Сообщение от taras atavin Посмотреть сообщение
Почему ты думаешь, что все циклы лишние?
Не правильно выразился. Одна итерация лишняя, а не один цикл. Условие n > 0 и n > 1 равнозначны в контексте этого алгоритма.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
заменил функцию переменной функцией константы, которая сама есть константа.
Это какая-то мантра, да? Я что-то совсем после слова "заменил" больше ничего не понял.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 19:26  [ТС] #27
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не правильно выразился. Одна итерация лишняя, а не один цикл. Условие n > 0 и n > 1 равнозначны в контексте этого алгоритма.
Ну вообще то я всегда факториал пишу
C++
1
2
3
4
5
6
r=1;
for (i=2; i<=x; ++i)
{
 r*=i;
}
return r;
. Но во-первых факториал был приведён, как пример цикла, перебирающего не массив. С этим спорить не будешь? Если перебирать все значения, то лучше сранивать с нолём, но может быть лучше сократить число итераций. Что получаем? Получаем на одно сравнение меньше, на один декремент меньше, на один переход меньше и на одно умножение меньше. Минус 4 операции. Но на каждой оставшейся итерации одна операция медленнее. Я не заморачиваюсь сравнением, где больше экономия времени. Да и у факториала цикл всегда с малым числом итераций. Было бы их много, лучше один раз умножить на 1. А так не знаю и выяснять не пытаюсь, так как смысла в этом не много. Тесты, кстати, не зря придуманы. Но занимается ли ими компилятор? Сомневаюсь. И я ведь не спроста упомянул, что предел цикла может совпадать с параметром и у других функций. Для некоторых из них и последняя итерация может иметь смысл, а само число итераций измеряться миллиардами и даже триллионами. Просто чтоб не искать и не сочинять настоящую функцию была взята другая с одним совпадающим свойством. А ты зачем то подменяешь неизвестный параметр константой и мухлюешь с прямым присваиванием ответа.
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это какая-то мантра, да? Я что-то совсем после слова "заменил" больше ничего не понял.
У тебя здравый смысл остался? Или только водка? Функция от константы есть константа и считать её не надо. В одном проекте был вообще цикл перебора порядка аппроксимации. Один из пределов был равен единице, но я сейчас не скажу направление цикла.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 19:27 #28
Цитата Сообщение от taras atavin Посмотреть сообщение
Но занимается ли ими компилятор? Сомневаюсь.
Зря сомневаешься. Занимается. Называется это PGO.


Цитата Сообщение от taras atavin Посмотреть сообщение
Но на каждой оставшейся итерации одна операция медленнее.
Негоодяй. Такой кайф мне обломал. Я уже хотел начать тебя троллить, что заменив 0 на 1 на каждой итерации цикла будет выполняться на одну операцию больше, а ты взял и обломал меня. Я плакать.


Цитата Сообщение от taras atavin Посмотреть сообщение
и мухлюешь с прямым присваиванием ответа.
Это не я. Он сам.
0
Bers
Заблокирован
23.05.2012, 19:31 #29
Настройки цикла.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 19:31
Привет! Вот еще темы с ответами:

Как обозвать ошибку? - Хостинг
Доброго всем. Ситуация такая - есть сайт на Wordpress, размещен на хостинге 101damain.com - хостинг гавно, знаю. На сайте...

.NET 4.x Как обозвать в c# строковый параметр из реестра (По умолчанию)? - C#
Добрый день. Как записан этот параметр в c# ? Есть некий код: public static string Recovery() { ...

результат в результате, или я даже не знаю, как обозвать этот борщ - PHP БД
Вот, допустим, есть: $res = mysqli_query($db, запрос №1); $b = ''; $a = '&lt;table id=&quot;mama&quot;&gt;'; while ($row =...

Как упростить конструкцию? - C#
Добрый всем вечер. Подскажите как можно упростить/сократить такую конструкцию: label7.Text = Array_Res_Level.ToString(); ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.05.2012, 19:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru