ОПЕРАТОРЫ для логического 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.,