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

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

Восстановить пароль Регистрация
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.09.2013, 21:42     Как скоротить, не обьявляя переменную? #1
Использование оператора безусловного перехода. К стати, я не вижу, как бы я вот написал то же самое биз него, так что зря его так критикуют.

В операторе иф ошибка. Я все же хотел как-нибудь выпиндреться и не обьявлять булеву переменную и вводить прямо в скобки ифа. Вот что я надумал

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
// Листинг 7.3.
 
 // Сложные условия в конструкциях while
 
 Boop: counter++; cout << "Enter a Bool number: "; if(  cin >>)return 0;// начало цикла
    unsigned short small;
 
    unsigned long large;
 
   const unsigned short MAXSMALL=65535;
 
 
 
   cout << "Enter a small number: ";
 
   cin >> small;
 
   cout << "Enter a large number: ";
 
  cin >> large;
 
 
 
   cout << "small: " << small << "...";
 
 
   // на каждой итерации проверяются три условия
 
   while (small < large && large > 0 && small < MAXSMALL)
 
      {
 
    if (small % 5000 == 0) // после каждых 5000 строк выводится точка
 
    cout << ".";
    small++;
    large-=2;
 
      }
 
 
 
   cout << "\nSmall: " << small << " Large: " << large << endl;
 
   goto Boop; // возвращение к началу
   system("pause");return 0;
 
 }
Как что-то подобное написать правильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.09.2013, 21:46     Как скоротить, не обьявляя переменную? #2
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
К стати, я не вижу, как бы я вот написал то же самое биз него, так что зря его так критикуют.
элементарно Ватсон
C++
1
2
3
4
5
6
//Boop: 
while(1)
{ counter++; cout << "Enter a Bool number: "; if(  cin >>)return 0;// начало цикла
........................................
 
 }// goto Boop; // возвращение к началу
видать не зря

Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
if( *cin >>)return 0;
что сие означает?
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.09.2013, 21:56  [ТС]     Как скоротить, не обьявляя переменную? #3
Спасибо!!!!!!


Означает выход из прграммы, по замыслу.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.09.2013, 21:57     Как скоротить, не обьявляя переменную? #4
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Означает выход из прграммы, по замыслу.
ну а по жизни?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.09.2013, 21:59     Как скоротить, не обьявляя переменную? #5
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Использование оператора безусловного перехода. К стати, я не вижу, как бы я вот написал то же самое биз него, так что зря его так критикуют.
Dimka-novitsek, для вас авторитеты в программировании существуют, кроме Либерти? Вот что Прата пишет насчёт goto.
Миниатюры
Как скоротить, не обьявляя переменную?  
ValeryS
16.09.2013, 22:04
  #6

Не по теме:

alsav22,
я бы даже сказал не в большинстве,а всегда
за всю мою практику ни разу не использовал
разве что в начале, когда переходил с ассемблера, мышление было "спагетти" испорчено

Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.09.2013, 22:26  [ТС]     Как скоротить, не обьявляя переменную? #7
Да, спасибо!!

А вот как-то вставить булеву переменнуюв цикл, что-то пока не получается. Чтоб раз-она там, и не обьявлять ее.

С этим значком не плучается тоже, т.к. так if( *cin >>)return 0; получается error C2100: недопустимое косвенное обращение
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.09.2013, 22:32     Как скоротить, не обьявляя переменную? #8
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
cin >>
ну дак данные с клавы заслать куда то надо
Tulosba
16.09.2013, 22:35
  #9

Не по теме:

ValeryS, ну для всяческих генераторов кода goto штука удобная.

ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.09.2013, 22:42     Как скоротить, не обьявляя переменную? #10
Цитата Сообщение от Tulosba Посмотреть сообщение
ValeryS, ну для всяческих генераторов кода goto штука удобная.
не спорю поскольку не работал
но вот разбиратся
я раньше мог написать так
C++
1
2
3
4
5
if(a==b)
 goto met;
fnc();
met:
return;
потом писал так
C++
1
2
3
4
if(a==b)
 return;
fnc();
return;
а сейчас могу написать так
C++
1
2
3
if(a!=b)
 fnc();
return;
и пока не встречал кода который нельзя переписать без гото
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,651
Записей в блоге: 1
17.09.2013, 00:05     Как скоротить, не обьявляя переменную? #11
Цитата Сообщение от ValeryS Посмотреть сообщение
и пока не встречал кода который нельзя переписать без гото
Можно-то можно, но не всегда нужно

Я делал расчеты, где штук 5 вложенных циклов. Каждый цикл на своем уровне проверяет некоторые условия и выход может произойти на цикл 2-3 уровнями выше (или вообще завершить все циклы). Как это просто сделать без goto (устанавливать различные флажки или есть другой способ)?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
17.09.2013, 07:19     Как скоротить, не обьявляя переменную? #12
Цитата Сообщение от zer0mail Посмотреть сообщение
Я делал расчеты, где штук 5 вложенных циклов. Каждый цикл на своем уровне проверяет некоторые условия и выход может произойти на цикл 2-3 уровнями выше (или вообще завершить все циклы). Как это просто сделать без goto (устанавливать различные флажки или есть другой способ)?
не понял
кто куда должен выйти?
кусочек кода, пожалуйста

Добавлено через 7 минут
ну вот пример
вместо
C++
1
2
3
4
5
6
for(i=0;i<10;i++)
  for(j=0;j<10;j++) 
     if(a==b)
        goto m1;
 
m1:
можно написать так
C++
1
2
3
4
5
6
7
fnc()
{
for(i=0;i<10;i++)
  for(j=0;j<10;j++) 
     if(a==b)
        return ;
}
или так
C++
1
2
3
4
5
6
7
8
9
for(i=0;i<10;i++)
  {
    for(j=0;j<10;j++) 
     { 
       if(a==b)
        break;
     }
    if(j<10)
       break;
или еще куча способов которые не нарушают модуль
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,651
Записей в блоге: 1
17.09.2013, 10:13     Как скоротить, не обьявляя переменную? #13
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял кто куда должен выйти?кусочек кода, пожалуйста
или еще куча способов которые не нарушают модуль
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fnc()
{
for(i=0;i<10;i++) {
    for(j=0;j<10;j++)  {
        for(k=0;k<10;k++) {
            for(m=0;m<10;m++)  {
                 if(x==y) goto m2;
                 if(x==z) goto m1;
                 for(m=0;m<10;m++)
                     if(a==b) goto m0;
                     if(a==c) goto m2;
                }
            }
        }
        {...}
        m2:
    }
    {...}
    m1: 
}
m0:
....
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
17.09.2013, 10:19     Как скоротить, не обьявляя переменную? #14
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
/* Данный набор операторов if и goto есть семантический эквивалент
 * оператора switch (x) */
if (x == 10)
  goto L10;
else if (x == 11)
  goto L11;
else if (x == 12)
  goto L12;
else
  goto Ldefault;
{                        <--- скобка 1
L10:                     <--- метка "case 10"
  y = 1;
  goto Finish;           <--- break
L11:                     <--- метка "case 11"
L12:                     <--- метка "case 12"
  y = 2;
  /* goto Finish; */     <--- закомментированный break
Ldefault:                <--- метка "default"
  y = 3;
  goto Finish;           <--- break
}                        <--- скобка 2
Finish:                  <--- метка за пределами switch'а, куда ведут все break'и
                              эта метка полностью эквивалентна тому, что есть
                              в циклах for и while
Взято из блога пользователя Evg "Как работает оператор switch в Си/Си++ "

Очень наглядно, да?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
17.09.2013, 10:36     Как скоротить, не обьявляя переменную? #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Взято из блога пользователя Evg
во первых он пишет не реальный код, а как это работает
во вторых это не всегда так
этот подход при сильно разреженном свитче
например такой код
C++
1
2
3
4
5
6
7
switch(m)
 {
   case 11: /* code 11*/ break;
   case 12: /*code12*/ break;
   case 13: /*code13*/ break;  
   default:  /*codeDefault*/
 }
превратится в ассемблере в такой код( чаще всего)
tabl:
offset code 11
offset code 12
offset codeDefault

1 вычесть из m 11
2 если меньше нуля и больше 2 то идти на codeDefault
3 полученное число умножить на размер адреса(чаще всего 4)
4 прибавить полученное число к адресу таблицы
5 по полученному адресу читать смешение
6 идти по полученному смещению

вечером скину дизасемблерный код (сейчас нет возможности)
а может и имитацию на Си засандалю
zer0mail, подумать надо, не готов так сходу
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
17.09.2013, 10:55     Как скоротить, не обьявляя переменную? #16
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых он пишет не реальный код, а как это работает
Да какая разница? Фрагмет приведен ради оценки читабельности
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
17.09.2013, 10:57     Как скоротить, не обьявляя переменную? #17
Цитата Сообщение от Croessmah Посмотреть сообщение
Да какая разница?
скажи честно, ты сам будешь такой код писать
Цитата Сообщение от Croessmah Посмотреть сообщение
ради оценки читабельности
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2013, 11:07     Как скоротить, не обьявляя переменную?
Еще ссылки по теме:

C++ Как в char запихнуть переменную?
C++ Как уничтожить переменную?
C++ Как объявить переменную, как диапазон чисел

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
17.09.2013, 11:07     Как скоротить, не обьявляя переменную? #18
Цитата Сообщение от ValeryS Посмотреть сообщение
скажи честно, ты сам будешь такой код писать
Конечно буду. Его разбор будет наказанием на том свете для программистов-грешников
Yandex
Объявления
17.09.2013, 11:07     Как скоротить, не обьявляя переменную?
Ответ Создать тему
Опции темы

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