【问题标题】:C++ / Java: Toggle boolean statement?C++ / Java:切换布尔语句?
【发布时间】:2010-06-18 13:56:33
【问题描述】:

有切换布尔值的捷径吗?

使用整数我们可以进行如下操作:

int i = 4;
i *= 4; // equals 16
/* Which is equivalent to */
i = i * 4;

那么还有一些布尔值(比如 *= 用于整数的运算符)吗?

在 C++ 中:

bool booleanWithAVeryLongName = true;
booleanWithAVeryLongName = !booleanWithAVeryLongName;
// Can it shorter?
booleanWithAVeryLongName !=; // Or something?

在 Java 中:

boolean booleanWithAVeryLongName = true;
booleanWithAVeryLongName = !booleanWithAVeryLongName;
// Can it shorter?
booleanWithAVeryLongName !=; // Or something?

【问题讨论】:

    标签: java c++ boolean toggle


    【解决方案1】:

    没有这样的操作符,但是这个有点短:booleanWithAVeryLongName ^= true;

    【讨论】:

    • 有趣的想法,但我不建议使用它。每个其他程序员都会浪费 5-10 秒来理解它的含义。
    • @Max:我同意。但他问是否有更短的方法:)
    • IMO,其他程序员在第一次看到这是一个好处时会花费 5-10 秒从您的代码中学习一些东西。
    • 你能在 Java/C++ 中运行按位独占或布尔值吗?你可以在 C 中,但是由于 C 中的任何非零值都是 true,并且 true 被定义为 1(至少在 Mac OS X 上),以上在 C 中被破坏了。无论如何,booleanWithAVeryLongName = !booleanWithAVeryLongName; 有什么问题?现代编辑器有一个很棒的功能,叫做代码完成。
    • @Jeremy: "booleanWithAVeryLongName ^= true;"在 C++ 和 Java 中是一个完全有效的构造。当然,“^= 1”在 Java 中是无效的。 “booleanWithAVeryLongName = !booleanWithAVeryLongName;”也没有任何问题。大多数人,包括我,都会这样写。这家伙只是好奇,如果有一个现有的运营商可以做到这一点。
    【解决方案2】:

    一个简单的函数怎么样(在 C++ 中):

    void toggle (bool& value) {value = !value;}
    

    然后你像这样使用它:

    bool booleanWithAVeryLongName = true;      
    toggle(booleanWithAVeryLongName); 
    

    【讨论】:

    • 我认为返回值可能会导致混淆函数是否改变其参数。
    • 我认为一个常见的解决方案是提供两个:bool toggle_copy(bool value) { return !value; }
    【解决方案3】:

    我认为更好的类比是您正在寻找一元 operator ++ 的布尔等效项,我很确定它不存在。

    我从来没有真正想过它,但我想你总是可以用 TRUE 异或它:

    booleanWithAVeryLongName ^= TRUE;
    

    不确定它会节省多少,但阅读起来有点痛苦。

    【讨论】:

    • TRUE 定义为 1,或 true(由 Petar 回答).. 还是一样?
    【解决方案4】:

    不完全是这样,但在 C/C++ 中,有用于按位与/或赋值的运算符。

    对于表达式之间的逻辑与/或 - 我认为没有。

    然而,在 C 语言中你并没有真正的布尔类型,只有整数,所以你可以使用整数运算符来完成这样的快捷方式。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多