На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> BOOL , инвертировать значение
    Привет!

    Есть небольшой вопросик :blush: .
    Определена переменная m_bCheck типа BOOL. Как инвертировать его значение? :fool:

    С типом bool я делала так:
    ExpandedWrap disabled
      b=!b;
    Сообщение отредактировано: Marihuana -
      Аналогично и c BOOL
        ExpandedWrap disabled
          BOOL b = TRUE;
          b = !( (bool)b );
          Цитата ss @
          BOOL b = TRUE;
          b = !( (bool)b );

          а так что не скомпиллеца или работать будет неправильно? :
          ExpandedWrap disabled
            BOOL b = TRUE;
            b = !b;
            Всё ок, ты прав. Приводить к bool излишество. Но безопасное :)
              Что-то я совсем ступила :jokingly:
              Спасибо!

              Добавлено
              PS. меня сбило с толку, что BOOL это int, вот я и думала как целое число можно инвертировать.
                Значение у переменной типа bool можно инвертировать ещё и так:

                ExpandedWrap disabled
                  b ^= 1;

                Но в случае с BOOL так делать не стоит.
                  Masterkent, даже в случае с bool так делать не стоит, ибо, на мой взгляд, ухудшает читаемость кода и не даёт чёткого представления о намерениях.
                    Никогда не видела такого интересного оператора b^=1. Проверила тоже работает!
                    А что он делает?
                    PS. извините за возможно глупый вопрос.
                      Это XOR, побитовое исключающее ИЛИ, описание тут, например.
                      Возвращает 0, если оба бита одинаковы, иначе 1. (Представь, что bool - это один бит. Пойми, и больше этого не представляй. ;) )

                      ЗЫ, прошлый раз соврал насчёт значений, пардон.
                      Сообщение отредактировано: ss -
                        А понятно! Забыла, что оператор ^ означает XOR. Я с ним никогда не сталкивалась.
                        Вообще же наверное его чаще используют в языке Си и системном программировании?
                          Цитата ss @
                          на мой взгляд, ухудшает читаемость кода

                          А на мой взгляд, читаемость кода ухудшает двойное указание модифицируемого объекта. Вместо b может быть имя подлиннее или вообще какое-нибудь сложное выражение.

                          Цитата ss @
                          и не даёт чёткого представления о намерениях

                          Это известный приём, и никаких затруднений в понимании такого кода быть не должно, IMHO. Впрочем, я справа от ^= обычно использовал true вместо 1.
                            А вот так:
                            ExpandedWrap disabled
                                b=b?0:1;

                            не подойдет?
                              для bool как по мне идеал
                              ExpandedWrap disabled
                                b ^= true;


                              Скрытый текст
                              а BOOL вообще использовать, имхо, фигово. к примеру, никак не пойму, для чего вообще TRUE задефайнили (разве что для того, чтобы приколоться над программистами, что результат winapi функции на TRUE проверят)
                                Чо вы к этому XOR'у присохли? "b != b" чем не угодило?

                                А ещё прикольно, что ПРАВДА для BOOL и VARIANT_BOOL - разная. Дополнительный источник для "странных" ошибок.
                                  Masterkent, ну об сим я знаю
                                  а в каком случае в стародавние времена использовался TRUE?

                                  Цитата ss @
                                  Чо вы к этому XOR'у присохли?

                                  тебе ж сказали, потому что переменная 1 раз пишется
                                  а то может быть не переменная, или переменная типа m_someQuiteComplicatedFlag
                                    Впрочем, говорить о старом C++ я, пожалуй, поспешил. BOOL используется в Win API, а Win API используется не только в программах на C++ и C :whistle:

                                    Цитата Alek86 @
                                    а в каком случае в стародавние времена использовался TRUE?

                                    В смысле?
                                    Сообщение отредактировано: Masterkent -
                                      аа, чисто чтоб иногда return TRUE; писать... то да
                                      просто проверять на него опасно
                                        Цитата ss @
                                        Чо вы к этому XOR'у присохли? "b != b" чем не угодило?

                                        И что это? причем тут XOR и оператор сравнения "!=" ?
                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                        0 пользователей:


                                        Рейтинг@Mail.ru
                                        [ Script execution time: 0,0517 ]   [ 16 queries used ]   [ Generated: 22.04.25, 21:16 GMT ]