Как получить противоположное значение переменной bool в C ++ - PullRequest
5 голосов
/ 11 ноября 2011

Для меня переменная bool указывает либо true , либо false .

Некоторая переменная bool была определена и инициализирована неизвестным нам значением. Я просто хочу получить противоположное значение этого. Как мне это сделать в C ++?

Ответы [ 7 ]

27 голосов
/ 11 ноября 2011

Просто используйте оператор !:

bool x = // something

bool y = !x;  //  Get the opposite.
15 голосов
/ 11 ноября 2011
bool b = false;

Правильное решение:

b = !b;

Интересные решения, которые не следует использовать:

b = b?false:true;
b ^= 1;
b = (b+1)%2;
b = 1>>b;
b = 1-b;
b = b-1;
b = -1*(b-1);
b = b+'0'+'1'-'b';

В качестве упражнения попытайтесь выяснить, почему вышеупомянутые решения работают.

11 голосов
/ 11 ноября 2011

ОПЕРАТОРЫ для логического Not

Вы можете выбрать, хотите ли вы написать !, или not, или некоторую смесь.

Тем не менее, начиная с версии 10.0 Visual C ++ не имеет встроенного зарезервированного слова not.

Так что для Visual C ++, если вы хотите использовать not, вы должны включить [*Заголовок 1015 * iso646.h ], который является заголовком из стандартной библиотеки C, гарантированно будет доступен и в C ++.Однако для стандартного компилятора C ++ включение этого заголовка не имеет никакого эффекта (как отмечено в сноске 176 стандарта C ++ 11).Так что вы можете просто включить его в любом случае:

#include <iostream>
#include <iso646.h>  // Visual C++ is not quite standard and requires this.

int main()
{
    using namespace std;

    // Display false and true as "false" and "true":
    cout << boolalpha;

    cout << "!false = " << !false << endl;
    cout << "not false = " << not false << endl;
}

О СРАВНЕНИИ булевых значений:

Некоторые новички пишут такие вещи, как

    v != true

Это не просто многословно, апрямая опасная привычка.Причина того, что это опасно, заключается в том, что многие API-интерфейсы определяют логические типы, где возможные значения не ограничиваются только 0 и 1 (основной пример - тип Window BOOL).Тогда значение может обозначать логическое Истина, но не быть численно равным Истине.

Таким образом, для максимальной безопасности используйте привычку использовать ! или not и просто никогда сравните непосредственно с литеральным логическим значением.

Примером, где обычно необходимо сравнивать логические значения, является случай, когда вам нужен логический Xor (исключительный или, или-или).В C ++ отсутствует оператор для этого на уровне bool.Но вы можете написать a != b, чтобы достичь того же, что и гипотетический оператор Xor уровня bool.


Логический Xor как управляемое выражение

В некоторых случаях вы хотитеинверсия (применение логического Not), если какое-то условие истинно, например…

    if( condition )
    {
        x = !x;
    }

Это может быть записано как ...

    x = ((condition) != x);

Это выглядит как полное запутывание, но оно имеетдве функции, которые могут быть полезны в определенных ситуациях:

  • это может использоваться как своего рода «замаскированная» инверсия для массива a значений со значениями некоторого другого массиваслужит для контроля того, является ли каждый элемент a инвертированным, и

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

Cheers & hth.,

10 голосов
/ 11 ноября 2011

Требуется оператор NOT, который ! в C, C ++ и многих других родственных языках.

bool t = true;
bool f = !t;    // f = false
6 голосов
/ 11 ноября 2011

С учетом bool value;, установленного соответствующим образом:

Вы должны использовать для этого:

  !value

, где ! логично, а не здесь.

Кроме того, существует ряд других способов достижения того же эффекта, которые все эффективно запутывают:

  1. std::not_equal_to<bool>()(true,value); (требуется #include <functional>)
  2. std::count(&value, &value+1, false); (требуется #include <algorithm>)
  3. std::count_if(&value,&value+1,std::not1(std::bind2nd(std::greater_equal<bool>(), true)));
4 голосов
/ 11 ноября 2011

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

    !

это должно дать вам то, что вам нужно.

0 голосов
/ 11 ноября 2011
bool opposite = (someboolvar) ? 0 : 1 ;
...