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

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

Восстановить пароль Регистрация
 
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 13:37     Как по-русски обозвать целиком эту конструкцию? #1
Ту что в круглых скобках в операторе for?
C++
1
2
3
4
for (i=0; i<n; ++i)
{
 cout<<i;
}
В фигурных скобках - тело, вся первая строка - заголовок. А то, что в круглых скобках целиком, но без самого оператора for? Я циклом пользоваться умею, мне нужна только формулировка, как он пишется.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niceonehere
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 147
23.05.2012, 13:45     Как по-русски обозвать целиком эту конструкцию? #2
i=0 стартовое значение счётчика
i<n условие выполнения тела
++i увеличение счётчика в данном случае до выполнения тела а если было i++ то после
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 13:52     Как по-русски обозвать целиком эту конструкцию? #3
Не знаю как все вместе называется, знаю что тут есть 3 блока.
Первый - блок инициализации.
Второй - блок условия.
Третий - пост-блок или как-то так(выполняется после тела цикла)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 14:07  [ТС]     Как по-русски обозвать целиком эту конструкцию? #4
Как сформулировать? "Сначала пишется сам оператор, потом обязательно в круглых скобках три блока, потом тело цикла. Телом цикла может быть ровно один простой, или составной оператор, в первом случае после него ставится точка с запятой, во втором точка с запятой после тела цикла не ставится. Порядок блоков: сначала блок инициализации, потом бок условия продолжения, потом блок модификации и между ними точки с запятой"? Получается то ли
C++
1
2
3
4
for (i=1; i<10; ++i)
{
 cout<<i;
}
, то ли
C++
1
2
3
4
for (i=1); (i<10); (++i)
{
 cout<<i;
}
.
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
23.05.2012, 14:43     Как по-русски обозвать целиком эту конструкцию? #5
Если сложно описать словами, опишите зрительно. Вроде этого:
Код
for(инициализация; выражение; инкремент)
{
  последовательность инструкций
}
А дальше уже расписывать по отдельности.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 14:52  [ТС]     Как по-русски обозвать целиком эту конструкцию? #6
Во-первых чаще декремент. Во-вторых какая к чёрту последовательность инструкций? По-нормальному это называется тело цикла. В третьих, надо же описать, где ставить скобки. Кстати,
C++
1
2
3
4
for (p=Start; p!=NULL; p=p->Next)
{
 cout<<p->Data<<",  ";
}
. Ищем инкремент с декрементом и удивляемся. В-третьих выражения бывают разные, а на самом деле там конкретно условие продолжения, которое есть выражение логического типа, или приводимое к логическому типу, истинное в том и только в том случае, когда цикл должен продолжаться и ложное, если его требуется прервать. Написав просто "выражение", ты теряешь и тип, и семантику.
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
23.05.2012, 15:13     Как по-русски обозвать целиком эту конструкцию? #7
Цитата Сообщение от taras atavin Посмотреть сообщение
По-нормальному это называется тело цикла
В случае, если тела как такового нет, мне кажется, лучше называть это дело циклом с пустой инструкцией.
Цитата Сообщение от taras atavin Посмотреть сообщение
Во-первых чаще декремент.
Спорно.
Цитата Сообщение от taras atavin Посмотреть сообщение
Написав просто "выражение", ты теряешь и тип, и семантику.
Цитата Сообщение от HighPredator Посмотреть сообщение
А дальше уже расписывать по отдельности.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 15:40  [ТС]     Как по-русски обозвать целиком эту конструкцию? #8
Цитата Сообщение от HighPredator Посмотреть сообщение
В случае, если тела как такового нет, мне кажется, лучше называть это дело циклом с пустой инструкцией.
С пустым телом, инструкции могут быть и в блоках инициализации и модификации.

Добавлено через 1 минуту
Цитата Сообщение от HighPredator Посмотреть сообщение
Спорно.
При оптимизации сравнений так даже почти всегда: отрицательные пределы всё таки встречаются редко, в основном положительные, а оптимизированное сравнение всегда выполняется только с нолём.
Deviaphan
23.05.2012, 15:42
  #9

Не по теме:

Слишком толсто. Даже не смешно ни разу.

taras atavin
23.05.2012, 15:42  [ТС]
  #10

Не по теме:

Deviaphan, а я не ты, мне народ смешить не надо.

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 15:48     Как по-русски обозвать целиком эту конструкцию? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
При оптимизации сравнений так даже почти всегда: отрицательные пределы всё таки встречаются редко, в основном положительные, а оптимизированное сравнение всегда выполняется только с нолём.
И тебя, разумеется, не смущает, что в большинстве случаев размерность это беззнаковая величина, которая меньше нуля не бывает по определению. size_t и всё такое...
Jupiter
23.05.2012, 15:51
  #12

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
По-нормальному это называется тело цикла
по-нормальному это называеться "составной оператор"

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 15:58  [ТС]     Как по-русски обозвать целиком эту конструкцию? #13
Цитата Сообщение от Jupiter Посмотреть сообщение
по-нормальному это называеться "составной оператор"
Допускается и простой, а составные бывают и без циклов.

Добавлено через 3 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
И тебя, разумеется, не смущает, что в большинстве случаев размерность это беззнаковая величина, которая меньше нуля не бывает по определению. size_t и всё такое...
Так а я о чём?
C++
1
2
size_t i;
for (i=N; i>0; --i)
, либо искусственно-знаковое сравнение аля
C++
1
2
signed long int i;
for (i=(signed long int)N-1; i>=0; --i)
(когда long int - мемсайз), а сами значения опять таки все неотрицательные.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 16:01     Как по-русски обозвать целиком эту конструкцию? #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Так а я о чём?
Код C++
1
2
size_t i;
for (i=N; i>0; --i)
А нулевой элемент массива ты куда дел и почему решил с ним не работать?
И не менее часто последующие значения зависят от предыдущих.
А если они не зависят друг от друга, то добро пожаловать в жестокий мир многопроцессорного программирования.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 16:02  [ТС]     Как по-русски обозвать целиком эту конструкцию? #15
Цитата Сообщение от Deviaphan Посмотреть сообщение
А нулевой элемент массива ты куда дел и почему решил с ним не работать?
А в этом варианте перебирается не массив. Счётчик цикла вообще не обязан быть параметром цикла и даже может иметь разрядность раза так в 2 побольше мемсайза.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 16:03     Как по-русски обозвать целиком эту конструкцию? #16
Честно признаюсь, я тоже больше люблю декремент.) Но почти им не пользуюсь, логика работы и не позволяет.(

Добавлено через 46 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
А в этом варианте перебирается не массив.
А что именно перебирается при помощи индекса, если это не массив?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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;
}
. Случаи, когда сравнение трогать нельзя, в контексте его оптимизации не рассматриваются. Но там инкремент/декремент врядли не примерно по ровну.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 17:57     Как по-русски обозвать целиком эту конструкцию? #18
Продолжим толстый троллинг.
В чём, с точки зрения оптимизации, разница между j<10 и j>=0 ?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2012, 18:08  [ТС]     Как по-русски обозвать целиком эту конструкцию? #19
Цитата Сообщение от Deviaphan Посмотреть сообщение
В чём, с точки зрения оптимизации, разница между j<10 и j>=0 ?
Даже если не учитывать загрузку лишнего операнда, либо необходимость занять один лишний регистр, сравнение с нолём само по себе быстрей.

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

Добавлено через 1 минуту
И тролят здесь меня, упорно уводя от вопроса о наименовании содержимого круглых скобок.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 18:39     Как по-русски обозвать целиком эту конструкцию?
Еще ссылки по теме:

C++ упростить конструкцию
C++ Как избежать такую конструкцию?
C++ Как это читается по-русски

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 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
Как говорится, не пытайтесь перехитрить компилятор.
Yandex
Объявления
23.05.2012, 18:39     Как по-русски обозвать целиком эту конструкцию?
Ответ Создать тему
Опции темы

Текущее время: 09:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru