【问题标题】:Changing bool values to opposite of the initial value将布尔值更改为与初始值相反
【发布时间】:2013-08-03 19:21:22
【问题描述】:

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

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

难道没有类似 int++ 或 int-- 的东西可以将 bool 值更改为与其值相反的值吗?

【问题讨论】:

标签: c# c++ c boolean


【解决方案1】:

这样做:

threadAlive = !threadAlive;

【讨论】:

  • @user1046403 在 C / C++ 中,您可以编写一个自定义运算符,使其更简单,在 C# 中,这已经足够了。
  • 即使您可以编写自定义运算符,也请帮大家一个忙,不要这样做。 b = !b 对任何了解该语言的人来说都是惯用的。
  • 也许会有类似 threadAlive 的东西!!那将是真棒。我怎么能写一个自定义运算符?有什么帮助吗?
  • 您的问题已解决。不要试图让它变得更糟。 (另外,请为 C 或 C++ 或 C# 或任何您正在学习的任何一种选择一些学习材料)
  • @p.s.w.g 在 C 中,没有自定义运算符。在 C++ 中,自定义运算符的至少一个参数必须是用户定义类型,或对用户定义类型的引用,bool 不是。 (当然,在任何一种语言中,您都可以编写一个宏来执行此操作。这种技术通常被称为混淆。)
【解决方案2】:

是的,有!

threadAlive ^= true;

(这是一个 C# 笑话,在大多数情况下,它在 C/C++/Javascript 中不起作用(根据某些条件,它可以在 C/C++/Javascript 中起作用),但是是真的!^ 是异或运算符)

【讨论】:

  • 我没想到它可以在 C# 中工作,但确实如此。为独创性 +1。
  • 这是个糟糕的笑话,因为没有指定 threadAlive 的类型。这将导致"not true" 对于int大部分 值是“真”,例如
  • @sehe 有一个C# 标签。但添加了关于语言的注释。
  • 它也应该在 C++ 中工作,前提是 threadAlive 的类型为 bool (并且由于他在 if 中使用它作为条件,这应该是一个安全的假设——尽管该语言确实允许其他类型,通过隐式转换,我什至看到一些程序员使用它们)。
  • @sehe 原始问题标有布尔标记,所以我认为这是一个公平的假设。不要以为他重新定义了问题,这也是最优雅的解决方案。
【解决方案3】:

这样就可以了:

threadAlive = !threadAlive;

正确的词是Toggle

【讨论】:

    【解决方案4】:

    逻辑否定运算符! 是一个对其操作数取反的一元运算符。它是为bool 定义的,当且仅当它的操作数是falsefalse 当且仅当它的操作数是true 时才返回true

    threadAlive = !threadAlive;
    

    【讨论】:

      【解决方案5】:

      使用! 运算符:

      bool b = true;
      
      b = !b;   // b is now false
      

      【讨论】:

        【解决方案6】:

        如果你正在寻找基本类型,你不能overload operators

        正如其他人已经提到的,这是迄今为止你最好的选择:

        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】:

          很简单:

          threadAlive = ! threadAlive;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-30
            • 1970-01-01
            • 2019-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-06
            • 2012-11-03
            相关资源
            最近更新 更多