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

Поиск:

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


pattern`щик
****


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

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



есть такой код:
Код

#include <stdexcept>
#include <iostream>
#include <functional>

/*
исходный код:

std::function<void()> func;
bool ok = false;
if ( !ok ) {
   if ( func ) {
      func();
   } else {
      throw std::runtime_error("exception");
   }
}

*/

void _func() {
   std::cout << "from _func" << std::endl;
}

int main() {
   std::function<void()> func(_func);
   bool ok = true;
   
   (ok)?(func)?func():throw std::runtime_error("from exception"):void();
}

http://liveworkspace.org/code/fec5d1814bf8...f8b44a270496a39

переписал его используя тернарное выражение.
все никак не мог понять что можно вставить в качестве последнего операнда. методом "тыка" подобрал void().
собственно вопрос: как компилятор трактует такую запись? что на самом деле оказывается вместо последнего операнда?

спасибо smile

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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



boostcoder, мне кажется это компиляторозависимо. Я как-то ставил NULL. На одном сработало, но другом выдало AV по адресу 0.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
boostcoder
Дата 20.11.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Alexeis @  20.11.2010,  20:10 Найти цитируемый пост)
но другом выдало AV по адресу 0.

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

сейчас работает. а вот будет ли работать завтра, на_другой_версии_компилятора/на_другой_платформе? smile 
PM WWW   Вверх
azesmcar
Дата 20.11.2010, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



boostcoder

а зачем так извращаться? это же нечитабельно.

Это сообщение отредактировал(а) azesmcar - 20.11.2010, 20:42
PM   Вверх
mes
Дата 20.11.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



интересует сам void()  или дальнейшая сопроваждаемость конструкции с тернарным оператором.. ?




Это сообщение отредактировал(а) mes - 20.11.2010, 20:41


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


Шустрый
*


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

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



А может понадёжней тогда писать там просто true или false? Всё равно ведь результат отработки этого тернарного оператора ничему не присваивается.

Код

(ok)?(func)?func():throw std::runtime_error("from exception"):true;


Добавлено через 1 минуту и 2 секунды
а вообще сорри, но выглядит жутко smile
PM MAIL   Вверх
mes
Дата 20.11.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Master01 @  20.11.2010,  19:43 Найти цитируемый пост)
а вообще сорри, но выглядит жутк

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

 (ok && func)? func() : throw std::runtime_error("from exception");



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


uploading...
****


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

Репутация: 81
Всего: 211



Цитата

The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or
the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized (8.5;
no initialization is done for the void() case).


Добавлено через 53 секунды
Цитата(mes @  20.11.2010,  20:45 Найти цитируемый пост)
ну чтоб не жутко выглядило, можно отказаться от одного "вопроса" в пользу "логического и"..

Тогда это будет неверный перевод. В случае !ok exception не должен быть сгенерирован (судя по коду)
PM   Вверх
mes
Дата 20.11.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  20.11.2010,  19:47 Найти цитируемый пост)
Тогда это будет неверный перевод. В случае !ok exception не должен быть сгенерирован (судя по коду) 

 smile , угу.. заметил когда отправил.. но не мог сразу добавить замечание..

Добавлено @ 20:57
тогда так :
Код

 if (ok) func ? func() : throw std::runtime_error("from exception");


Это сообщение отредактировал(а) mes - 20.11.2010, 21:04


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


pattern`щик
****


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

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



Цитата(azesmcar @  20.11.2010,  20:40 Найти цитируемый пост)
а зачем так извращаться? это же нечитабельно.

помоему нормально выглядит smile 
Цитата(mes @  20.11.2010,  20:41 Найти цитируемый пост)
интересует сам void()  или дальнейшая сопроваждаемость конструкции с тернарным оператором.. ?

сам void()

Добавлено через 2 минуты и 28 секунд
мнение большинства понял.
я то пытался избавится от первоначального блока с if`ами.
значит вернусь к прежнему.

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

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0626 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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