Я просто хочу перевернуть логическое значение на основе того, что уже есть. Если это правда - сделайте ложью. Если ложь - сделай правдой.
Вот отрывок из моего кода:
switch(wParam) {
case VK_F11:
if (flipVal == true) {
flipVal = false;
} else {
flipVal = true;
}
break;
case VK_F12:
if (otherVal == true) {
otherValVal = false;
} else {
otherVal = true;
}
break;
default:
break;
}
c++
c
boolean
boolean-logic
John T
источник
источник
Понятно нужен заводской выкрой!
: D
источник
Если вы знаете, что значения 0 или 1, вы можете это сделать
flipval ^= 1
.источник
^
это оператор исключающего ИЛИ .0^1
есть1
, и1^1
есть0
. Это то же самое, что и добавление, если вы игнорируете бит переноса. Или вы можете думать об этом так: если один из битов равен 1, результат обратен другому биту. Или вы можете думать об этом как о вопросе: эти две части разные?Самое простое решение, которое я нашел:
источник
x = !x;
не только короче, но и разборчивее.longVariableName ^= true;
явно короче, чемlongVariableName = !longVariableName;
И каждый программист должен знать XOR.a ^= b
значитa = a ^ b
, где^
означает XOR. Обозначенияa °= b
дляa = a ° b
любого оператора°
очень распространены в синтаксисе C / C ++ / C #.gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;
Конечно, самое чистое, что можно сделать, - это расширить ее до нескольких строк и использовать временные переменные для хранения объектов, ноgRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1
она гораздо более читабельна, менее подвержена ошибкам и меньше символов, чем исходный код. ,Просто для информации - если вместо целого числа ваше обязательное поле представляет собой один бит в более крупном типе, используйте вместо этого оператор 'xor':
источник
Кажется, это все бесплатно ... Хех. Вот еще одна вариация, которая, я думаю, больше относится к категории «умных», чем то, что я бы рекомендовал для производственного кода:
Я думаю, это преимущества:
И столь же очевидный недостаток -
Это похоже на решение @korona, использующее?:, Но на один (небольшой) шаг дальше.
источник
Просто потому, что в списке нет моего любимого способа переключения bool ...
тоже работает. :)
(да,
x = !x;
это понятнее и легче читается)источник
Решение codegolf'ish было бы больше похоже:
источник
Я предпочитаю решение Джона Т, но если вы хотите использовать весь код, ваше утверждение логически сводится к следующему:
источник
то же самое касается
источник
Очевидно, вам нужно гибкое решение, которое может поддерживать типы, маскирующиеся под логические. Это позволяет:
Затем вы можете специализировать это для разных типов, которые могут претендовать на логические значения. Например:
Пример использования этой конструкции:
Нет, я не серьезно.
источник
Для целых чисел со значениями 0 и 1 вы можете попробовать:
MWE в C:
источник
Просто потому, что мне нравится подвергать сомнению код. Я предлагаю вам также использовать тернар, сделав что-то вроде этого:
Пример:
источник