布尔运算技巧

7
我曾经在代码中见过这个,但是忘记了。基本上它可以切换一个布尔变量的值。如果它是真的,它将被设置为假,反之亦然。但不幸的是我忘记了语法。
这基本上是一个使用一行代码实现的操作:
if (myVar) {  
    myVar = false;  
} else {  
    myVar = true;  
}  

这个东西大概长这样,但是不知道它叫什么或者正确的语法:

myVar = myVar : false ? true;

我猜那是一个打错的字,多余的v? - Aaron Anodide
1
如果您找到了其中一个答案是您正在寻找的内容,您可以在该数字下方单击“接受”复选标记。 - OscarRyz
13个回答

70

怎么样?

myVar = !myVar

?


1
是的,这是一个不错的切换 -- 尽管是否使用给定的语法取决于您在应用程序中正在做什么。你知道的 -- 它与你实际所做的概念上有多接近。 - Joshua Evensen
3
因为这个回答只提供了一种替代方案,所以它根本没有回答问题。 - Guffa
你的声望几乎都是从这里获得的,不是吗?这就是为什么我不写答案。 - amara
9
这太疯狂了,回答连问题中一半的条件运算符都没提到就可以得到+40分? - Michael Mrozek
工作并且简单。我猜我忘记了五年级的数学 :P - dime
我一段时间前看到了这个语法,我对它的简洁性感到惊讶。 - Stephan Muller

27

myVar = !myVar; 是使用条件运算符

你也可以这样做

myVar = !myVar;

2
你把 : 和 ? 搞反了。应该是 条件 ? 真分支 : 假分支 - Tesserex
此外,由于在大多数编程语言中它是唯一的三元运算符,因此经常被称为“三元运算符”。 - Ben

17

另一种选项是异或(XOR):

myVar ^= true;

值得注意的是,只有赋值语句的左侧会发生变化;右侧是常量,并将切换任何布尔变量。在我看来,否定更具自说明性,尽管如此。


它也比其他任何东西都要快(虽然在这个级别上你不应该担心速度)。 - ILMTitan
3
@Lie: OP询问了Java相关问题,但该问题对于Java布尔类型来说是无效的。 - Mark Peters
有人可以评论一下为什么会被踩吗?我知道这段代码的功能是正确的,这并不难证明。所以我不确定为什么它已经被踩了两次。 - Mark Peters
1
myVar ^= 1>0; 给定一个长度大于3的变量名,这是您能找到的最短代码吗? - Thomas Mueller
好的,Thomas,我改口了 :-). 很棒的代码。我想你也可以有一个常量 public static final boolean T = true,这将允许 myVar^=T;。这样就可以分摊到更少的代码。 - Mark Peters
显示剩余3条评论

5
你想要的是条件运算符:
myVar = myVvar ? false : true;

正如你所看到的,很多人称之为“三元运算符”,但这只意味着它是一个具有三个操作数的运算符。恰巧,在这种语言中只有一个具有三个操作数的运算符,但这仍然不能说明该运算符的作用。

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

myVar = !myVar;

4

我目前能想到的最小的代码。我不知道它叫什么(如果它有一个名称,正如你所暗示的那样)

myVar = !myVar

1
它被称为否定。手册中应该有算术和逻辑运算符的列表。 - Alexander Rautenberg
这个操作显然是取反操作,但我天真地认为整个表达式在流行语中可能有其他花哨的名称。 - Goutham

4
你所说的是“三元运算符”或“条件运算符”,根据条件进行内联替换。
其语法为:
condition ? trueValue : falseValue

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

所以举个例子,假设你想返回两个数中较大的一个:

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

请注意,它可以替换到其他内容中间。
好的,现在让我们来解决你实际提出的关于切换布尔类型的问题。
myVar = (myVar) ? false : true;

这是使用条件运算符的方法。(再次说明,括号不是必需的,我只是偏爱它们。)
但是,有一种更简单的方法来切换布尔值...使用逻辑非(" ! ")运算符:
myVar = !myVar;

保持简单。:-)

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

1
对于拼写错误(myVar vs MyVar)和过度冗长的内容,给予-1和嘘声,对于结尾的幽默感给予+1。如果修正了拼写错误,我可能会给你+1(和嘘声)。 :-) - Platinum Azure
6
我不会点赞,因为我不想让寻找这些信息的人感到困惑,但你得到了我的精神支持。 :) - Jeff
请将有关编程的以下内容从英语翻译成中文。仅返回已翻译的文本:-1. 将不好和完全明显的TheDailyWTF参考保留在不好和完全明显的TheDailyWTF评论部分。 - Mark Peters

2
这也可以工作 :P
v=v?!v:!v;

喜欢这个!但为了保持Java的精神,它可能应该是v = (!v == false) ? !v : !v - Alexander Rautenberg
哈哈哈哈哈!太聪明了。不过对于Java来说太紧凑了,这可能真的能赢得代码高尔夫比赛!:-P - Platinum Azure
1
这段代码是什么意思:v=!v?!v:!v; :) :) - OscarRyz
2
聪明绝顶,为了增加不可读性,将变量命名为 ii=!i?!i:!i; - Joachim Sauer
@Joachim,ehehh或小写字母“L” l =!l?!l:!l; - OscarRyz

0

有一个三元运算符(wikipedia),它允许您编写类似于第二个示例中的简洁if-else语句。

在Java中:

myVar = (myVar) ? true : false;

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

myVar = !myVar;

0
public boolean toggle(boolean bool)
{
  return !bool;
}

1
我不会点踩,但是为此编写一个辅助函数的想法让我感到有些沮丧。这就像是编写一个函数 public int plus(int a, int b) { return a + b }; 一样,只是增加了冗余。如果 Java 支持按引用传递,那么这个想法可能会有一定的价值。 - Mark Peters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接