【问题标题】:boolean operation trick布尔运算技巧
【发布时间】:2010-09-10 18:43:17
【问题描述】:

我以前在代码中看到过这个,但忘记了。基本上它切换一个布尔变量。如果为真,它将设置为假,反之亦然。但是很遗憾忘记了语法。

这基本上是一个衬里:

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

是这样的,但不知道它叫什么或它的正确语法:

myVar = myVar : false ? true;

【问题讨论】:

  • 我认为这是一个错字,额外的 v?
  • 如果您发现其中一个答案就是您要找的答案,您可以点击数字下方的“接受”复选标记。

标签: java boolean


【解决方案1】:

怎么样

myVar = !myVar

?

【讨论】:

  • 是的,这是一个很好的切换——尽管它真的取决于你在你的应用程序中所做的事情,你是否想使用给定的语法来处理这样的事情。你知道——它在概念上与你实际做的事情有多接近。
  • +0:因为这个答案只提供了一个替代方案,它根本不回答这个问题。
  • 你几乎所有的代表都来自这个,不是吗?这就是我不写答案的原因。
  • 这太疯狂了,+40 的答案甚至没有提到问题的一半条件运算符?
  • 工作且简单。我想我忘记了五年级的数学:P
【解决方案2】:

myVar = myVar ? false : true; 正在使用conditional operator

你可以这样做

myVar = !myVar;

【讨论】:

  • 你有 : 和 ?向后。它去condition ? true branch : false branch
  • 此外,这通常被称为“三元运算符”,因为它是大多数编程语言中唯一的 3 元运算符。
【解决方案3】:

另一种选择是异或:

myVar ^= true;

值得注意的是,只有作业的 LHS 会发生变化;右侧是常量,将切换任何布尔变量。不过,Negation 的 IMO 更能自我记录。

【讨论】:

  • 给定一个长度 > 4 的变量名,这也是你能找到的最短代码。
  • 它也比其他任何东西都快(不是你应该担心这个级别的速度)。
  • 你可以让它更短:myVar ^= 1;
  • @Lie:OP 询问了 Java。这对 Java 布尔值无效。
  • myVar^=1>0;给定一个长度 > 3 的变量名,this 是你能找到的最短代码吗?
【解决方案4】:

你想到的是条件运算符:

myVar = myVvar ? false : true;

(如您所见,很多人称其为“三元运算符”,但这仅意味着它是具有三个操作数的运算符。碰巧,这种语言中只有一个具有三个操作数的运算符,但是它仍然没有说明操作员的工作。)

使用否定运算符当然更容易:

myVar = !myVar;

【讨论】:

    【解决方案5】:

    目前我能想到的最小代码。我不知道它叫什么(如果它有名字,就像你建议的那样)

    myVar = !myVar
    

    【讨论】:

    • 它被称为否定。手册中的某处应该有算术和逻辑运算符的列表。
    • 运算当然是否定运算,但我天真地认为整个表达式可能在流行的术语中还有其他花哨的名称。
    【解决方案6】:

    您所说的是“三元”或“条件”运算符,它根据条件进行内联替换。

    语法是:

    condition ? trueValue : falseValue
    

    我通常在我的条件周围加上括号,有时在整个条件运算符周围。取决于我尝试将其与其他所有内容区分开来的程度。

    例如,假设您要返回两个数字中较大的一个:

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

    请注意,它可以替换到其他东西的中间。


    好的,现在让我们来解决您关于切换布尔类型的实际问题。

    myVar = (myVar) ? false : true;
    

    是使用条件运算符的方式。 (同样,括号不是必需的,我只是喜欢它们。)

    但是有一种更简单的方法来切换布尔值...使用逻辑 NOT ("!") 运算符:

    myVar = !myVar;
    

    保持简单。 :-)

    【讨论】:

      【解决方案7】:
      if(myVar == true)
      {
          myVar = false;
      }
      else if (myVar == false)
      {
          myVar = true;
      }
      else
      {
          myVar = FILE_NOT_FOUND
      }
      

      【讨论】:

      • -1 和对拼写错误(myVar vs MyVar)和过于冗长的抱怨,最后的幽默感 +1。修正错字,我可能会给你+1(和呻吟)。 :-)
      • 没有我的支持,因为我不想让任何认真寻找此信息的人感到困惑,但您在精神上得到了我的支持。 :)
      • -1。将糟糕且完全明显的 TheDailyWTF 引用保留在糟糕且完全明显的 TheDailyWTF 评论部分。
      【解决方案8】:

      这也有效:P

      v=v?!v:!v;
      

      【讨论】:

      • 喜欢这个!!!但是为了保持 Java 精神,它可能应该是 v = (!v == false) ? !v : !v
      • 哈哈哈哈!那太好了。不过,对于 Java 来说太简洁了——这实际上可以赢得一场代码高尔夫! :-P
      • 怎么样:v=!v?!v:!v; :) :)
      • 出色且增加了不可读性,请调用变量i: i=!i?!i:!i;
      • @Joachim, ehehh 或小写“L”l=!l?!l:!l;
      【解决方案9】:

      有一个三元运算符 (wikipedia)。它允许您像第二个示例一样编写一个精简的 if-else 语句。

      在java中:

      myVar = (myVar) ? true : false;
      

      还有一个 NOT 运算符,用于切换布尔变量。在java中就是!。我相信这就是你想要的。

      myVar = !myVar;
      

      【讨论】:

        【解决方案10】:
        public boolean toggle(boolean bool)
        {
          return !bool;
        }
        

        【讨论】:

        • 我不会投反对票,但是为此使用辅助函数的想法让我有点死心了。这就像拥有一个函数public int plus(int a, int b) { return a + b };。只是增加冗余。如果 Java 有 pass-by-ref 可能会有好处。
        【解决方案11】:

        我最近(我自己)找到了与此处已说明的答案类似的答案。然而,最简单和最短(代码最少的非重复变量名)的答案是:

        formControl.disabled ^= 1;
        

        当想要切换基于 DOM 的布尔属性(例如,表单控件/输入的禁用属性——从不可编辑状态变为可编辑状态)时,这在 JavaScript 中效果最佳。经过大量搜索(没有我喜欢的结果)和一些试验和错误后,我发现我的解决方案是最简单的(但是,真实而不是 1 会更清晰 - 正如之前发布的那样)。

        由于这种语法不是很清楚,所以我不建议经常使用它(我相信当变量或属性使上下文显而易见时是合适的)。我已经发布了这个回复(而不是发表评论),因为应该使用 XOR 按位自赋值的上下文非常重要。在考虑最佳实践时,应该尽量避免这种“技巧”。

        【讨论】:

          【解决方案12】:

          正如其他人所指出的,有两种方法可以否定某些东西:“lvalue = !lvalue;”和“左值^= 1;”。认识到差异很重要。

          说“lvalue = !lvalue”将导致 lvalue 如果它为零则设置为 1,如果它设置为 其他任何值,则设置为 0。左值将被评估两次;这不是简单变量的一个因素,但是说“someArray[index1][index2][index3][index4] = !someArray[index1][index2][index3][index4]”可能会减慢速度。

          说“左值^= 1;”如果左值为 0,将导致左值设置为 1,如果为 1,则设置为 0,如果它既不是零也不是 1,则设置为其他值。左值只需要指定或评估一次,并且如果已知该值为零或 1,这种形式可能会更快。

          可惜没有自动取反运算符;有时候这样的东西会很方便。

          【讨论】:

            【解决方案13】:

            您还可以使用此处所示的二进制形式的否定。

            if ((v == true) && !(v = false)) {
                v != true;   /* negate with true if true. */
            } else {
                v =! false;  /* negate with false if false. */
            }
            

            【讨论】:

            • 我希望我能多次对此投反对票。我只能认为这不是出于善意发布的,这是错误的。我想对于初学者我可以说 != 不是赋值运算符,所以 v != true; 不会改变 v。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-26
            相关资源
            最近更新 更多