Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Часто встречаю в исходниках такую конструкцию:
Код:
do {
//что то делается
if(что то == чему-то){
//ещё что то делается
break;
}
// ну и ещё что то делается
}while(0);
Это такая альтернатива goto или имеет какие то преимущества перед обычным if?

Последний раз редактировалось Alex11223; 21.06.2018 в 09:47.
Shadowfirst вне форума Ответить с цитированием
Старый 20.06.2018, 19:33   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Это альтернатива goto.
waleri вне форума Ответить с цитированием
Старый 21.06.2018, 08:08   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

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

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

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

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

А если кому-то не нравятся исходники Мелкомягких то можете покопаться в линуксе - там этого добра тоже навалом.
waleri вне форума Ответить с цитированием
Старый 21.06.2018, 09:44   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от 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");
    }
}
... ну и конечно в большинстве случаев лучше делать это с помощью функций.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 21.06.2018 в 09:47.
Alex11223 вне форума Ответить с цитированием
Старый 21.06.2018, 12:49   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А зачем его там ставить?
Код:
if (blabla)
  assert(false);
assert сам по себе содержит if, так что его надо заворачивать в { }.
В итоге имеем { } с ; в конце...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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