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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как записать в булевскую переменную ее отрицание, попроще 
V
    Опции темы
Alek86
Дата 14.5.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

Код
g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps


есть ли в С++ стандартный способ поменять ее значение, не требующий писать вот ЭТО 2 раза?

типа функции std::negate (такой вроде нету), или вообще неизвестной мне конструкции языка

(про варианты типа создания временной переменной-ссылки и написания своей функции negate я знаю - интересно легчайшее СТАНДАРТНОЕ решение)


--------------------
user posted image    user posted image
PM MAIL   Вверх
SergeCpp
Дата 14.5.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps ^= 1;


Это сообщение отредактировал(а) SergeCpp - 14.5.2008, 14:38
PM MAIL WWW ICQ   Вверх
Alek86
Дата 14.5.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(SergeCpp @  14.5.2008,  13:17 Найти цитируемый пост)
g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps ^= 1;


похоже на правду
и компилер (MSVC) даже ворнинги не дает

но все же спрошу - вы уверены, что это по стандарту и что для любого стандартного компилера
<false> ^= 1 будет давать true
и
<true> ^= 1 будет давать false
?

Это сообщение отредактировал(а) Alek86 - 14.5.2008, 13:25


--------------------
user posted image    user posted image
PM MAIL   Вверх
SergeCpp
Дата 14.5.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



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


Explorer
****


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

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



Цитата(Alek86 @  14.5.2008,  14:22 Найти цитируемый пост)
но все же спрошу - вы уверены, что это по стандарту и что для любого стандартного компилера<false> ^= 1 будет давать trueи<true> ^= 1 будет давать false?

а при чем тут компилятор? это битовая логика.


--------------------
Мой блог
PM MAIL WWW   Вверх
SergeCpp
Дата 14.5.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



user posted image


Это сообщение отредактировал(а) SergeCpp - 14.5.2008, 13:50
PM MAIL WWW ICQ   Вверх
vinter
Дата 14.5.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



а вообще std::logical_not<type>(param)


--------------------
Мой блог
PM MAIL WWW   Вверх
JackYF
Дата 14.5.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



А есть ещё ссылки:

Код

bool& param = g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps;
param = !param;


Это так, для развития - "^= 1" лучше в данном случае.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
SABROG
Дата 14.5.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Alek86 @  14.5.2008,  13:08 Найти цитируемый пост)
про варианты типа создания временной переменной-ссылки


Цитата(JackYF @  14.5.2008,  14:47 Найти цитируемый пост)
А есть ещё ссылки:


Не любит автор ссылки с указателями smile


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Alek86
Дата 14.5.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(SABROG @  14.5.2008,  15:38 Найти цитируемый пост)
Не любит автор ссылки с указателями

кто тебе сказал эту ересь? smile
обожаю

просто, я добивался именно элементарной операции отрицания
жаль, что ее запись неочевидна


Цитата(vinter @  14.5.2008,  13:54 Найти цитируемый пост)
а вообще std::logical_not<type>(param)

этот (цитата со стандарта)
Цитата
template <class T> struct logical_not : unary_function<T,bool> {
bool operator()(const T& x) const;
};
4 operator() returns !x.

и чем же он тут поможет? smile


Цитата(SergeCpp @  14.5.2008,  13:42 Найти цитируемый пост)
true

false

а на стандарт ссылку можно?
я нашель только
Цитата
A zero value, null pointer value, or null member pointer value is converted to false any other value is converted to true.

но, вроде твой способ этому не противоречит
+

Добавлено через 11 минут и 11 секунд
хотя нет, противоречит
если в true вместо единицы будет двойка, то ^=1 не поможет

Это сообщение отредактировал(а) Alek86 - 14.5.2008, 16:38


--------------------
user posted image    user posted image
PM MAIL   Вверх
SABROG
Дата 14.5.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(Alek86 @  14.5.2008,  16:35 Найти цитируемый пост)
хотя нет, противоречит
если в true вместо единицы будет двойка, то ^=1 не поможет


Код

    bool tst = 2; //true
    tst ^= 1; // false
    tst ^= 1; //true



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Alek86
Дата 14.5.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



SABROG, если тема перешла на сцылки со Стандарта, то примеры кода уже не помогут
сцылки нужно только сцылками крыть smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 14.5.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Alek86 @  14.5.2008,  18:18 Найти цитируемый пост)
SABROG, если тема перешла на сцылки со Стандарта, то примеры кода уже не помогут

lда то ты к стандарту то пристал? причем стандарт к стандартным оперциям с битами?
Цитата(Alek86 @  14.5.2008,  17:35 Найти цитируемый пост)
и чем же он тут поможет? 

ступил, думал что он меняет.
Цитата(Alek86 @  14.5.2008,  17:35 Найти цитируемый пост)
если в true вместо единицы будет двойка, то ^=1 не поможет

конечно не поможет smile
можно так:
Код

g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps ^= 1;
g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps &= 1;



--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 14.5.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну это если четное. а для любого числа - что-нить типа
Код

((g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps -= 1) &= 0x70000000) >>= 30;


Добавлено через 1 минуту и 52 секунды
хотя такому "стандартному" я бы предпочел нестандартое попроще  smile 
PM MAIL   Вверх
Rififi
Дата 14.5.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код
enum Bool
{ Invert };

bool& operator<<(bool& b, Bool)
{ return b = !b; }

bool b = true;
b << Invert;

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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Rififi, не могу одобрить... нестандартно, требует дополнительный код. Ссылка, имхо, лучше.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MTWizard
Дата 14.5.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Alek86 @  14.5.2008,  16:35 Найти цитируемый пост)
хотя нет, противоречитесли в true вместо единицы будет двойка, то ^=1 не поможет

В bool по стандарту лежат только true и false. Там нет чисел (пункт 3.9.1/6). true конвертируется в число 1, false в 0 (пункт 4.5/4). Для этих чисел получим 1^1 = 0 -> false, 0^1 = 1 -> true (как ты сам привёл в цитате). Так что всё по стандарту  smile

Это сообщение отредактировал(а) MTWizard - 14.5.2008, 19:03
PM MAIL   Вверх
nickless
Дата 14.5.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

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



Цитата(Alek86 @  14.5.2008,  12:08 Найти цитируемый пост)
есть ли в С++ стандартный способ поменять ее значение, не требующий писать вот ЭТО 2 раза?

А как насчет варианта перепроектировать это дело чтобы не надо было тянутся за переменными (я так понимаю там не только тот bool smile ) через дальний восток? smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
mes
Дата 14.5.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Rififi @  14.5.2008,  18:45 Найти цитируемый пост)
enum Bool
{ Invert };

bool& operator<<(bool& b, Bool)
{ return b = !b; }

bool b = true;
b << Invert;

или так 
Код

inline bool bool_invert (bool& b) { return b=!b; }
inline bool bool_invert (const bool& b) { return !b; }


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


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


Эксперт
***


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

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



Цитата(nickless @  14.5.2008,  19:29 Найти цитируемый пост)
А как насчет варианта перепроектировать это дело чтобы не надо было тянутся за переменными (я так понимаю там не только тот bool  ) через дальний восток? 

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

Цитата(MTWizard @  14.5.2008,  19:00 Найти цитируемый пост)
(пункт 4.5/4).

это единственное, чего я добивался

и вообще весь вопрос был - как ПОПРОЩЕ стандартно инвертировать переменную
про ссылки и доп. функции смотрите первый пост

ЗЫ. жаль, что читающий такой код
Код
bool b = true;
//...
b ^= 1;

будет долго вдуплять, что сие значит
придется таки функцию писать :(


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 15.5.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alek86 @  15.5.2008,  10:09 Найти цитируемый пост)
будет долго вдуплять, что сие значит
придется таки функцию писать :( 

если у тебя 
Цитата(Alek86 @  15.5.2008,  10:09 Найти цитируемый пост)
жаль, что читающий такой код
Код

bool b = true;
//...
b ^= 1;

так наверно будет симпатичней :
Код

b^=true;


P.S.
Цитата(Alek86 @  15.5.2008,  10:09 Найти цитируемый пост)
про ссылки и доп. функции смотрите первый пост

про ссылки прочитал, а вот про функции упустил - сбило std::negate - она же функция 
плюс к тому же ИМХО любой код несуший самостоятельную логику должен быть разгружен (посредством функции)


Это сообщение отредактировал(а) mes - 19.5.2008, 01:00


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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Alek86 @  15.5.2008,  10:09 Найти цитируемый пост)
будет долго вдуплять, что сие значит

значит он неправильно профессию выбрал  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 15.5.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MAKCim @  15.5.2008,  10:34 Найти цитируемый пост)
значит он неправильно профессию выбрал 

перефразирую
читаться такой текст будет намного хуже, чем
Код
bool b = true;
//...
negate(b);



Цитата(mes @  15.5.2008,  10:30 Найти цитируемый пост)

так наверно будет симпатичней:
Код
b^=true;

да, это и правда получше smile



--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 16.5.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(MAKCim @  15.5.2008,  10:34 Найти цитируемый пост)
значит он неправильно профессию выбрал  smile  

Всё он правильно выбрал smile. Мы не криптографы и не криптоаналитики и в чужих кодировках мыслей по хорошему разбираться не обязаны(но приходится smile).

Цитата(Alek86 @  15.5.2008,  10:47 Найти цитируемый пост)
читаться такой текст будет намного хуже, чем

Такой текст тоже очень плох. Ф-ция на то и ф-ция, чтобы что-то брать на вход и что-то выдавать на выход, а не модифицировать свои входные данные. Есть конечно случаи когда это целесообразно(и примеров этому куча), но, не думаю, что в данном случае.

Цитата(JackYF @  14.5.2008,  14:47 Найти цитируемый пост)
Это так, для развития - "^= 1" лучше в данном случае. 

Чем, блин? smile
Самый лучший и понятный вариант - это с ссылкой. Он
1. понятен.
2. не уступит в производительности варианту с ^=(особенно в случае с preferences - не думаю, что кто-то станет редактировать preferences миллионы раз в секунду).
3. на случай опасности случайно изменить значение по ссылке ей можно дать ограниченную область видимости

Ребят, пишите так чтобы потом (хотя бы) самим понятно было... Я с месяца полтора назад на скорую руку наклепал одну программу. Точнее говоря на скорую руку наклепал я одну её часть. Пару дней назад мне пришлось добавлять ф-ционал как раз в эту часть. И, несмотря на то, что у меня там не было таких вещей как ^= и им подобных, я половину рабочего дня(!!) сидел и пытался одуплить
1. как эти 30 строк вообще работают
2. каков необходимый результат(от этих строк)
3. как переделать так чтобы помимо добавления ф-ционала результат остался тем же


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 16.5.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(archimed7592 @  16.5.2008,  10:58 Найти цитируемый пост)
Такой текст тоже очень плох. Ф-ция на то и ф-ция, чтобы что-то брать на вход и что-то выдавать на выход, а не модифицировать свои входные данные. Есть конечно случаи когда это целесообразно(и примеров этому куча), но, не думаю, что в данном случае.

С этим не могу согласиться. Имхо, дело привычки.

к тому же если функция названа negate, лично я ее перевожу как "поменять значение на противоположное" а не "вернуть противоположное"


--------------------
user posted image    user posted image
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1276 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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