将布尔值改为其相反值

36

这可能听起来很奇怪,但我懒得每次都写

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

是否有类似于int ++或int--的东西可以将bool值更改为其相反值?


1
可能是Can I 'invert' a bool?的重复问题。 - ShooShoSha
7个回答

83

只需这样做:

threadAlive = !threadAlive;

在 C/C++ 中,你可以编写一个自定义运算符使其更简单,但在 C# 中这已经是最好的了。 - p.s.w.g
13
即使你可以编写自定义运算符,还是请不要这样做,让所有人受益。b = !b 对于理解该语言的人来说是惯用语。 - Joel
17
你的问题已经解决了,不要试图把它变得更糟。此外,请挑选一些 C、C++ 或者 C# 的学习材料(或者你正在学习的任何一门语言)。 - R. Martinho Fernandes
1
@user1046403 编写自定义运算符是完全不同的问题。1)选择一种语言,2)进行一些研究,3)尝试一些东西,4)如果遇到问题,请在SO上提出一个新问题。 - p.s.w.g
@JamesKanze 我自大学以来就没有使用过C++,所以我不确定。我不想说这是绝对不可能的。 - p.s.w.g
显示剩余2条评论

23

是的,有!

threadAlive ^= true;

(这是一个C#笑话,在大多数情况下,它在C/C++/Javascript中不起作用(取决于一些条件,它 可能 在C/C++/Javascript中生效),但它是真实的!^ 是异或运算符)


我没想到在C#中会生效,但它确实可以。对于创意加1。 - p.s.w.g
这是一个糟糕的玩笑,因为threadAlive的类型没有被指定。这将导致“不正确”的结果在大多数int值中变成“正确”。 - sehe
1
@sehe 有一个 C# 标签。但是添加了关于语言的注释。 - xanatos
只要 threadAlive 的类型是 bool(并且由于他在 if 中将其用作条件,这应该是一个安全的假设——尽管语言允许其他类型,具有隐式转换,我甚至看到一些程序员使用它们),它也应该在 C++ 中工作。 - James Kanze
2
@sehe 原始问题标记了一个布尔标签,所以我认为这是一个公平的假设。我不认为他重新定义了问题,而且这是最优雅的解决方案。 - tuseau
显示剩余2条评论

17
这样做就可以了:
threadAlive = !threadAlive;

正确的术语是切换


11

逻辑非运算符!是一个一元运算符,它对其操作数进行取反。它适用于bool类型,当且仅当它的操作数为false时返回true,当且仅当它的操作数为true时返回false

threadAlive = !threadAlive;

7

如果你想要对基本类型进行运算符重载,那是不可能的。

正如其他人已经提到的,这绝对是你最好的选择:

threadAlive = !threadAlive;

你可以自己创建一个bool类型并重载++或任何你想要的运算符来翻转值,但我永远不会建议这样做。下面的代码是绝对不应该使用的:

以下代码是绝对不应该使用的:

public class MyBool
{
    bool Value;

    public MyBool(bool value)
    {
        this.Value = value;
    }

    public static MyBool operator ++(MyBool myBoolean)
    {
        myBoolean.Value = !myBoolean.Value;
        return myBoolean;
    }
}

你也可以创建自己的扩展方法,但这并不是更好的方式。


7
使用 ! 操作符:
bool b = true;

b = !b;   // b is now false

5
非常简单:
threadAlive = ! threadAlive;

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