Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 20.06.2018, 18:59   #1
Shadowfirst
 
Регистрация: 13.09.2010
Сообщений: 9
Репутация: 10
По умолчанию Зачем нужна такая конструкция?

Часто встречаю в исходниках такую конструкцию:
Код:

do {
//что то делается
if(что то == чему-то){
//ещё что то делается
break;
}
// ну и ещё что то делается
}while(0);

Это такая альтернатива goto или имеет какие то преимущества перед обычным if?

Последний раз редактировалось Alex11223; 21.06.2018 в 10:47.
Shadowfirst вне форума   Ответить с цитированием
Старый 20.06.2018, 20:33   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,471
Репутация: 1667
По умолчанию

Это альтернатива goto.
waleri вне форума   Ответить с цитированием
Старый 21.06.2018, 09:08   #3
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,637
Репутация: 2356

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
Сообщение от Shadowfirst Посмотреть сообщение
Часто встречаю в исходниках такую конструкцию
Где ты их берёшь-то? Никакого смысла не вижу в do...while (false);
__________________
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума   Ответить с цитированием
Старый 21.06.2018, 09:45   #4
Shadowfirst
 
Регистрация: 13.09.2010
Сообщений: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Где ты их берёшь-то? Никакого смысла не вижу в do...while (false);
Мало ты исходников похоже пересмотрел от microsoft. У них в ATL такое встречается.
Shadowfirst вне форума   Ответить с цитированием
Старый 21.06.2018, 09:51   #5
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 7,637
Репутация: 2356

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
Сообщение от Shadowfirst Посмотреть сообщение
Мало ты исходников похоже пересмотрел от microsoft.
Скажу честно - никогда в глаза их не видал.
Цитата:
Сообщение от Shadowfirst Посмотреть сообщение
У них в ATL такое встречается.
Что такое ATL - не знаю.
__________________
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума   Ответить с цитированием
Старый 21.06.2018, 10:23   #6
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,471
Репутация: 1667
По умолчанию

Одна из фишек do while(0) это то, что это выражение, которое требует ; в конце.
Вы не поверите, но есть (или по крайней мере были) компиляторы, которые выдают предупреждение на, по сути, пустое выражение ";".
Или посмотрите на макрос типа assert и попробуйте вставить его в if. Можно конечно обойтись просто блоком { } но вложенные блоки это сравнительно недавняя возможность, плюс те же компиляторы, которые не потерпят ; в конце { }.

А если кому-то не нравятся исходники Мелкомягких то можете покопаться в линуксе - там этого добра тоже навалом.
waleri вне форума   Ответить с цитированием
Старый 21.06.2018, 10:44   #7
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,332
Репутация: 3200

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
do while(0) это то, что это выражение
Это инструкция (statement), а не выражение (expression).

Цитата:
Сообщение от waleri Посмотреть сообщение
те же компиляторы, которые не потерпят ; в конце { }.
А зачем его там ставить?

Цитата:
Сообщение от Shadowfirst Посмотреть сообщение
какие то преимущества перед обычным if?
Как вариант — меньше вложенность.
Это еще Guard называется.
Например
Код:

void doStuff(string username)
{
    if (username.length() < 2)
    {
        return;
    }

    // do something
}

вместо
Код:

void doStuff(string username)
{
    if (username.length() >= 2)
    {
        // do something
    }
}

или
Код:

void doStuff(string username)
{
    if (username.length() >= 2)
    {
        if (username != "Hitler")
        {
            // do something
        }
        else
        {
            throw Exception("Hitlers not allowed!");
        }
    }
    else
    {
        throw Exception("too short username");
    }
}

... ну и конечно в большинстве случаев лучше делать это с помощью функций.

Последний раз редактировалось Alex11223; 21.06.2018 в 10:47.
Alex11223 вне форума   Ответить с цитированием
Старый 21.06.2018, 13:49   #8
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,471
Репутация: 1667
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А зачем его там ставить?
Код:

if (blabla)
  assert(false);

assert сам по себе содержит if, так что его надо заворачивать в { }.
В итоге имеем { } с ; в конце...
waleri вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, что означает такая конструкция int R { get; set; } robix C# (си шарп) 10 18.06.2016 19:49
Почему такая конструкция не работает with Workbooks("name.xlsm").ActiveSheet. Selection ? RISagitov Microsoft Office Excel 8 18.11.2015 13:53
Основные управляющие конструкции языка Delphi. Конструкция присваивания. Условная конструкция. Конструкция множественного выбора. nadyaH Помощь студентам 3 23.11.2013 22:19
нужна вот такая программа dikzz Фриланс 2 27.11.2012 01:48


13:49.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru