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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> if() и assert() в качестве левого выражения 
V
    Опции темы
boostcoder
Дата 15.7.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем привет.

нужно выполнить assert() и вне зависимости от его результата, проверить значение второго аргумента(выражения?)

пример:
Код

#include <iostream>
#include <cassert>

int f1() {
   std::cout << __PRETTY_FUNCTION__ << std::endl;
   return 1;
}

int f2() {
   std::cout << __PRETTY_FUNCTION__ << std::endl;
   return 1;
}

int main() {
   if ( (assert(f1()), 1) && f2() ) {
      std::cout << "true" << std::endl;
   } else {
      std::cout << "false" << std::endl;
   }
}

http://liveworkspace.org/code/774a525f3900...e370a7bb2fdb34b
где:
f1() - то, что является критичным. и без чего нет смысла выполнять/проверять что-либо.
f2() - следующее выражение. которое бессмысленно проверять при провале f1().

проблема в том, что assert() не возвращает никакого значения. посему пришлось замудрить такое выражение.
вопрос: этот код корректен? просто еще никогда такого не видел)

спасибо.

Добавлено @ 19:19
Цитата(boostcoder @  15.7.2011,  19:18 Найти цитируемый пост)
просто еще никогда такого не видел)

хотя нет. видел. в каких-то квестах/задачах..

Up.
ах да. многие наверное задумываются над смыслом такой записи. успокойтесь. его тут нет. я просто учусь.

Это сообщение отредактировал(а) boostcoder - 15.7.2011, 20:10
PM WWW   Вверх
fish9370
Дата 15.7.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  15.7.2011,  19:18 Найти цитируемый пост)
не зависимости от его результата, проверить значение второго аргумента(выражения?)


а что значит вне зависимости? прога к тому моменту уже будет на пол пути к exit() 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 15.7.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



оно и понятно. просто не знаю как иначе объяснить.
думаю если посмотреть код, то все станет на свои места.
PM WWW   Вверх
fish9370
Дата 15.7.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно зарегистрировать функцию с помощью atexit, которая при выходе будет проверять значение f2()


--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 15.7.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(fish9370 @  15.7.2011,  20:11 Найти цитируемый пост)
можно зарегистрировать функцию с помощью atexit, которая при выходе будет проверять значение f2()

в том то и дело. что если assert() провалился, то ничего более проверять не нужно. нужно просто завершиться.
PM WWW   Вверх
mes
Дата 15.7.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(boostcoder @  15.7.2011,  18:59 Найти цитируемый пост)
оно и понятно. просто не знаю как иначе объяснить.
думаю если посмотреть код, то все станет на свои места. 

не становится.. вообщето в выражении f1() && f2()  второй аргумент будет вычисляться только при первом успешном.. 



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


pattern`щик
****


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

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



Цитата(mes @  15.7.2011,  20:19 Найти цитируемый пост)
вообщето в выражении f1() && f2()  второй аргумент будет вычисляться только при первом успешном

так именно это мне и нужно. я об этом и написал. и fish9370`у тоже самое объяснил.

код работает как надо.
основной вопрос тут:
Цитата(boostcoder @  15.7.2011,  19:18 Найти цитируемый пост)
этот код корректен?


PM WWW   Вверх
mes
Дата 15.7.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(boostcoder @  15.7.2011,  19:13 Найти цитируемый пост)
 что если assert() провалился, то ничего более проверять не нужно.

так если ассерт провалился так и так проверяться дальше не будет..



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 15.7.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



mes, т.е. тут, f1() будет выполняться в любом случае. если же результат - ложь - завершаемся по assert`у. если истина - if`у передаем единицу которая после запятой, и выполняем f2().

PM WWW   Вверх
mes
Дата 15.7.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(boostcoder @  15.7.2011,  19:21 Найти цитируемый пост)
этот код корректен?

не понятно чего от него ожидается.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 15.7.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  15.7.2011,  20:22 Найти цитируемый пост)
если ассерт провалился так и так проверяться дальше не будет

да.
но мы получаем два в одном:
1. assert() который сработает как любой уважающий себя assert() в случае лжи в его выражении.
2. если же assert() истинен - передаем if`у единицу которая после запятой, и выполняем f2().
PM WWW   Вверх
mes
Дата 15.7.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



чем хуже просто :
Код

 assert(f1());
 if ( f2()) ) ...



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 15.7.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  15.7.2011,  20:26 Найти цитируемый пост)
чем хуже просто

ничем не хуже. просто любопытно. учиться же как-то надо.
PM WWW   Вверх
mes
Дата 15.7.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(boostcoder @  15.7.2011,  19:26 Найти цитируемый пост)
но мы получаем два в одном:
1. assert() который сработает как любой уважающий себя assert() в случае лжи в его выражении.
2. если же assert() истинен - передаем if`у единицу которая после запятой, и выполняем f2(). 

как оно работает то понятно, не понятно, чего ожидалось и для чего такие ухищрения .. )



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 15.7.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  15.7.2011,  20:28 Найти цитируемый пост)
не понятно, чего ожидалось и для чего такие ухищрения

ожидалось именно то, как оно работает.
а ухищрения для понимания.

ладно, что-то не удалась тема...

всем спасибо.

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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