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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение значения переменной условия в условии, undefined behavior или нет? 
V
    Опции темы
WhKitten
Дата 22.4.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно ли делать так?
Код

node* r = getRootNode();
node* n;
if (((n=r->north) && (n=n->north) && n->data->isValid()) ||
    ((n=r->east) && (n=n->east) && n->data->isValid()) ||
    ((n=r->south) && (n=n->south) && n->data->isValid()) ||
    ((n=r->west) && (n=n->west) && n->data->isValid()))
{
// некоторый код
}


Последовательность вычислений логических выражений вроде чётко определена, но меня смущает то, что переменная n постоянно меняется по ходу вычисления этого выражения. Можно ли так делать и будет ли значение такого выражения чётко определено в независимости от реализации?

Это сообщение отредактировал(а) WhKitten - 22.4.2011, 18:11
PM MAIL   Вверх
borisbn
Дата 22.4.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(WhKitten @  22.4.2011,  16:36 Найти цитируемый пост)
Можно ли так делать и будет ли значение такого выражения чётко определено в независимости от реализации?

По стандарту последовательность вычислений выражений в if чётко определена. Мало того, если первое (вернее очередное) условие дает однозначный вывод о результате (false && expr или true || expr), то оставшаяся часть вычисляться не будет.
Это что касается стандарта. Во всех ли реализациях он будет поддерживаться ? Думаю да. Во всяком случае в этой части.

Если уж сильно смущает, можешь переписать без дополнительной переменной и без присваивания. Будет более громоздко, но (м.б.) более приятно глазу

Код

node* r = getRootNode();
node* n;
if ( ( r->north && r->north->north && r->northr->north->data->isValid() ) ||
     ( r->east && r->east->east && r->eastr->east->data->isValid() ) ||
     ( r->south  && r->south->south && r->southr->south->data->isValid() ) ||
     ( r->west  && r->west->west && r->westr->west->data->isValid() )
  )
{
// некоторый код
}


только сейчас заметил там не хватает откравающих скобок. оно вообще не должно компилироваться


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
WhKitten
Дата 22.4.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо! А то помню, что где то читал, что нельзя менять значения переменной в выражении более одного раза и вот тут засомневался относится ли это к логическим выражением или нет. Хорошо, что не относится. smile
PS. Скобочки на всякий случай поправил. smile

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


Эксперт
****


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

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



можно ещё поизвращаться smile

node, как я понимаю, объявлен примерно так
Код

struct node {
struct { bool isValid() { return true; } } data;

    node *north;
    node *east;
    node *south;
    node *west;
};

тогда делаем такую ф-цию
Код

template< node * node::*FieldPtr >
bool isWorldSideValid( node * r ) {
    return (r->*FieldPtr) && (r->*FieldPtr)->*FieldPtr && ((r->*FieldPtr)->*FieldPtr)->data.isValid();
}


и вызов становится таким
Код

node* r = getRootNode();
if ( isWorldSideValid<&node::north>( r ) ||
     isWorldSideValid<&node::east>( r ) ||
     isWorldSideValid<&node::south>( r ) ||
     isWorldSideValid<&node::west>( r )
   )
{
...
}



сами вы извращенцы smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
WhKitten
Дата 22.4.2011, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Интересная идея, ещё раз спасибо. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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