трюк с булевыми операциями - PullRequest
       6

трюк с булевыми операциями

7 голосов
/ 10 сентября 2010

Я видел это раньше в коде, но забыл это.В основном это переключает логическую переменную.Если это правда, он будет установлен в ложь и наоборот.Но, к сожалению, забыл синтаксис.

Это в основном одна строка для этого:

if (myVar) {  
    myVar = false;  
} else {  
    myVar = true;  
}  

Это что-то вроде этого, но не знаю, как это называется или правильный синтаксис этого:

myVar = myVar : false ? true;

Ответы [ 13 ]

70 голосов
/ 10 сентября 2010

Как насчет

myVar = !myVar

?

27 голосов
/ 10 сентября 2010

myVar = myVar ? false : true; использует условный оператор .

Вы можете просто сделать это, хотя

myVar = !myVar;
17 голосов
/ 10 сентября 2010

Другой вариант - XOR:

myVar ^= true;

Примечательно, что меняется только LHS задания; правая часть постоянна и будет переключать любую логическую переменную. Впрочем, отрицание - более самодокументирующееся ИМО.

5 голосов
/ 10 сентября 2010

То, о чем вы думаете, это условный оператор:

myVar = myVvar ? false : true;

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

Конечно, проще использовать оператор отрицания:

myVar = !myVar;
4 голосов
/ 10 сентября 2010

То, о чем вы говорите, это «троичный» или «условный» оператор, который выполняет внутреннюю замену в соответствии с условием.

Синтаксис:

condition ? trueValue : falseValue

Обычно я ставлю скобки вокруг своего состояния, иногда вокруг всего условного оператора. Зависит от того, насколько я пытаюсь отделить это от всего остального.

Например, предположим, что вы хотите вернуть большее из двух чисел:

public int max(int a, int b)
{
  return (a > b) ? a : b;
}

Обратите внимание, что его можно подставить в середину чего-то другого.

<ч />

Хорошо, теперь давайте ответим на ваш актуальный вопрос о переключении логического типа.

myVar = (myVar) ? false : true;

- это то, как вы делаете это с условным оператором. (Опять же, скобки не требуются, я просто одобряю их.)

Но есть более простой способ переключить логическое значение ... с помощью логического оператора NOT ("!"):

myVar = !myVar;

Будьте проще. : -)

4 голосов
/ 10 сентября 2010

Самый маленький код, который я могу себе представить на данный момент.Я не знаю, как он называется (если у него есть имя, как вы, кажется, предлагаете)

myVar = !myVar
3 голосов
/ 10 сентября 2010
if(myVar == true)
{
    myVar = false;
}
else if (myVar == false)
{
    myVar = true;
}
else
{
    myVar = FILE_NOT_FOUND
}
2 голосов
/ 10 сентября 2010

Это также работает: P

v=v?!v:!v;
0 голосов
/ 27 июля 2012

Я недавно (самостоятельно) нашел ответ, аналогичный уже указанному здесь.Однако самый простой и самый короткий (неповторяющееся имя переменной с наименьшим кодом) ответ:

formControl.disabled ^= 1;

Это лучше всего работает в JavaScript, когда требуется переключить логические атрибуты на основе DOM (например, элемент управления формы)свойство input / input - переход из нередактируемого в редактируемое состояние).После долгих поисков (без результатов, которые мне понравились) и проб и ошибок я обнаружил, что мое решение является самым простым (однако, истина вместо 1 будет более понятной - как было ранее опубликовано).

Поскольку этот синтаксис не очень понятен, я бы не советовал использовать его очень часто (я считаю, что это целесообразно, когда переменная или свойство делают контекст очевидным).Я разместил этот ответ (вместо того, чтобы сделать его комментарием), потому что контекст, в котором должно использоваться побитовое самоопределение XOR, очень важен.Этого «трюка» следует избегать при рассмотрении лучших практик.

0 голосов
/ 11 сентября 2010

Вы также можете использовать двоичную форму отрицания, как показано здесь.

if ((v == true) && !(v = false)) {
    v != true;   /* negate with true if true. */
} else {
    v =! false;  /* negate with false if false. */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...