Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Куда приводит GOTO, по просьбе "телезрителей" 
:(
    Опции темы
Coocky
Дата 27.10.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 2
Всего: 62



Я подвожу итоги!
три оператора могут(должны smile ) делать цикл
for, while, goto.
два первых-одно и тоже. Только вот goto работает без разрушения обьектов внутри него.
Ну и. Теперь слово за ненавидящими goto в пользу while и for smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Void
Дата 27.10.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Neitron @ 27.10.2005, 20:12)
Для оптимизациооного кода, использование процессорных циклов, является наилучшим вариантом.

Если имеется в виду x86 инструкции loop, то это уже давно не так. Цикл закодированный с помощью обычных команд перехода получается быстрее.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Coocky
Дата 27.10.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 2
Всего: 62



Mayk
И че-рушится?
А если фигурные скобки убрать? smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
maxim1000
Дата 27.10.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Coocky @ 27.10.2005, 18:12)
Ну хитрец!
А че в цикл засунул?
Ты цикл из goto сделай и выложи!

имелось в виду, что при выходе из блока с помощью goto объекты нормально удаляются...


--------------------
qqq
PM WWW   Вверх
Neitron
Дата 27.10.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



А если вспомнить про немаловажную вещь как Стиль программирования С++?
Правильный и неправильный?
goto - неправильный.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Mayk
Дата 27.10.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Neitron @ 27.10.2005, 22:12)
Не думаю, что реализации упускают такую возможность.

Я повторюсь, но у компиляторов иное мнение на этот счёт smile
(посмотри листинги борлы, вязанки, гнуса. Они далеко не все forы и whileы в луп пихают.

Код

    for(int i = 0; i != 123; ++i)
            t += i;

вот отрывок из асма(компилил как g++ -O3 a.cpp)
Код

LCFI4:
        subl    $8, %esp
.LCFI5:
        movl    $5, %eax
        andl    $-16, %esp
        movl    %edx, t
        xorl    %edx, %edx
        .p2align 4,,15
.L9:
        addl    %edx, %eax
        incl    %edx
        cmpl    $123, %edx
        movl    %eax, t
        jne     .L9
        leave
        xorl    %eax, %eax
        ret


Добавлено @ 18:19
Цитата(Coocky @ 27.10.2005, 22:17)

А если фигурные скобки убрать?

Код

while(i < 5){
  s+= i;
  ++i
}


А если фигурные скобки убрать? © smile

Это сообщение отредактировал(а) Mayk - 27.10.2005, 18:22


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 27.10.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 2
Всего: 62



Mayk smile
Цитата(Neitron @ 27.10.2005, 18:17)
А если вспомнить про немаловажную вещь как Стиль программирования С++?
Правильный и неправильный?
goto - неправильный.

Еще раз прошу-аргументы...
Кто сказал такое- твой преподаватель, друг , книжники буржуазные? smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Neitron
Дата 27.10.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Допустим, goto полезно использовать внутри одного блока.
Но если начать использовать goto в разных блоках, то результаты непредсказуемы.
И вообще я домой. Рабочий день кончился. smile smile

Вложенный цикл единственное место где полезно использовать goto.
В остальных случаях ругайте свои руки, за кривой код. smile smile smile smile smile smile

Это сообщение отредактировал(а) Neitron - 27.10.2005, 18:27


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Coocky
Дата 27.10.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 2
Всего: 62



Ладно и я домой.
Пока в goto ничего плохого с точки зрения работы не увидел.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Vyacheslav
Дата 27.10.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Любопытно. Автор весьма пристрастен или лукавит. Небольшое изменение в его же коде( is_valid() - лишняя , а create при неудаче выбрасывает исключение) и все становиться весьма прозрачно и лаконично. В том числе и вывод лога. Можно кстати повозиться с темплайтаим и все встанет на свои места
Код

long fill_file( const char *psz )
{
   try {
         file    file;
         file.create( sz_path );
         unsigned    size = file.get_size();

         file_mapping    map;
         map.create( file.h );
   
         void    *ptr = map.map_view();
        
         memset( ptr, 'a', size );

         map.unmap_view( ptr );
   } catch (myexception& err ) {
          cout << err.what()
          return err.code();
    }
    return 0;
}


Сравниваем с этим
Код

long fill_file( const char *psz )
{
    long    error_code = 0;
    void    *ptr = 0;
    HANDLE    hfile = 0, hmap = 0;
    unsigned size;

    error_code = 1;
    hfile = CreateFile( psz, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 );
    if( !hfile )goto _end;

    error_code = 2;    
    size = ::GetFileSize( hfile, 0 );
    hmap = ::CreateFileMapping( hfile, 0, PAGE_READWRITE, 0, 0, 0 );
    if( !hmap )goto _end;
    
    error_code = 3;
    ptr = ::MapViewOfFile( hmap, FILE_MAP_WRITE, 0, 0, 0 );
    if( !ptr )goto _end;
    
    memset( ptr, 'a', size );
    error_code = 0;
_end:
    if( error_code )_trace_file( 0, "error %d/%08x", error_code, ::GetLastError() );
    ::UnmapViewOfFile( ptr );
    ::CloseHandle( hmap );
    ::CloseHandle( hfile );
    
    return error_code != 0;
} 


Выводы делайте сами.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 27.10.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
Теперь слово за ненавидящими goto в пользу while и for

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

деление последовательности операторов на блоки {} лично мне очень помогает, оно позволяет структурировать код, даже необязательно, чтобы был какой-то цикл или условный оператор, создавать маленькие объекты в стеке на очень маленькое время, просто попользоваться и удалить

использование оператора goto в принципе позволяет переходить границы этих блоков: выходить и входить
в этом он схож с исключениями - те позволяют выходить из блоков и, по многим отзывам, являются далеко не самым хорошо понимаемым элементом C++

только, если выход из блока можно обработать более-менее корректно - просто поудалять объекты, то с несанкционированным входом в блок начинаются проблемы, из-за того, что в отличие от уничтожения объекта способов создания может быть куча...

и, пожалуйста, не надо говорить "так не надо использовать goto для прыжком между блоками", потому что по той же логике не стоит делать в класах protected и private

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

Это сообщение отредактировал(а) maxim1000 - 27.10.2005, 18:33


--------------------
qqq
PM WWW   Вверх
srd
Дата 27.10.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(Vyacheslav @ 28.10.2005, 02:27)
Любопытно. Автор весьма пристрастен или лукавит. Небольшое изменение в его же коде( is_valid() - лишняя , а create при неудаче выбрасывает исключение) и все становиться весьма прозрачно и лаконично. В том числе и вывод лога. Можно кстати повозиться с темплайтаим и все встанет на свои места

В соответствии с упоминавшейся выше RAII функция-член create() тут тоже лишняя. А если её выбросить, то пропадёт неоднозначность в порядке вызовов деструкторов, что было одним из аргументов автора.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
maxim1000
Дата 27.10.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(maxim1000 @ 27.10.2005, 18:28)
только, если выход из блока можно обработать более-менее корректно - просто поудалять объекты, то с несанкционированным входом в блок начинаются проблемы, из-за того, что в отличие от уничтожения объекта способов создания может быть куча...

а вот тут, уважаемый maxim1000, я бы возразил smile
попробовал сделать, то что описал, оказывается, что запрещено пропускать инициализацию объектов с помощью goto...
Добавлено @ 18:44
а для выходов из циклов, пожалуй, подходит...


--------------------
qqq
PM WWW   Вверх
Vyacheslav
Дата 27.10.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Coocky @ 27.10.2005, 18:04)
Цитата(Neitron @ 27.10.2005, )
является первым признаком, плохо спроектированного кода

smile Аргументы? Что такое плохо спроектированный код. Назови мне разницу между циклами goto,for, while( не синтаксическую..)
А как быть с обьектами, которые разрушаются, при выходе из цикла? smile

А Вы не создавайте в цикле smile, тогда и разрушаться не будут

Код

struct B 
{
    B() { s_number++;}
    ~B() { m_number = 0; }
     static int s_number;
     int m_number;
};

int B::s_number = 0;
int main(int argc, char* argv[])
{

  Label:
  B b ;
  cout <<  b.m_number  << endl;
  b.m_number =    B::s_number ;
  if  (B::s_number < 5 ) goto Label;

  cout << b.m_number << endl;
  return 0;
}


И вот после этого начинаем думать в каких случаях когда удаляется и когда создается smile


А теперь делаем финт ушами
Код

struct B 
{
    int func(){ return m_number; }
    int m_number;
};

int main(int argc, char* argv[])
{
    
  if ( true ) goto Label;

  B b ;
  b.m_number = 5;
  Label: int result = b.func();
  return 0;



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
nikitao
Дата 27.10.2005, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



Цитата
Кто сказал такое- твой преподаватель, друг , книжники буржуазные?

Лично у меня возникает вопрос почему все книжники так говорят?B ведь не С один в других языках анологично.Все пишут одно и тоже:
-это противоречит принципам структурного програмирования
-злоупотребление goto может привести к нестабильной работе приложения.
Никаких аргументов в доказательство этоих правил не приводится.Это как аксеома програмирования,но это таким не является.
Единственной мысолью которая у меня приходит в голову-это то что когда-то давным давно действительно goto(или подобный оператор) по каким то причинам использовать было опасно(к примеру компелятор плохо с ними спровлялся).В результате этого наложили на него табу.Прошло время и из покаления в покаление это табу передавалось,но никто не проверял правдивость этого правила.


ЗЫ А с чего все начиналось:c детской игрушки smile .


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0713 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.