【问题标题】:Is there a better way to invert the value of a boolean on a loop?有没有更好的方法来反转循环中布尔值的值?
【发布时间】:2021-01-28 09:32:00
【问题描述】:

我这里有这个循环,它交替一个布尔值。

这就是我的意思:

bool switch = false;

while(true) {
    switch = !switch;
    std::cout << switch << std::endl;
}

这段代码每次循环时,布尔型命名开关都会在真假之间交替。

类似:

bool switch = false;

while(true) {
    std::cout << !switch << std::endl;
}

这确实没有什么问题,但我想要一个单行解决方案。

当然,这是行不通的,但类似的东西。

【问题讨论】:

  • 这有什么问题?
  • 取出换行符。问题解决了:-)
  • C++ 并不像 python 那样痴迷于单行代码。您的第一个变体是最清晰的变体。更喜欢那个。
  • while ((switch = !switch) || true) std::cout &lt;&lt; switch &lt;&lt; std::endl; 会做到的。但是,对于将来要维护您的代码的程序员(包括您自己)不一定友好。

标签: c++


【解决方案1】:
std::cout << (switch = !switch) << std::endl;

或者

std::cout << !switch << std::endl << switch << std::endl;

【讨论】:

  • 如果你是新手,那么现在是学习坏习惯的好时机。将来,当您不熟悉此代码时,您将需要阅读此代码。
【解决方案2】:

如果您只想更改switch并在一行代码中输出,您可以这样做:

std::cout << (switch = !switch) << std::endl;

但几乎可以肯定,除了将您的行数减少一个之外,这不会做任何事情,充其量是一个可疑的成就。它很可能以相同的底层机器代码结束。

【讨论】:

  • 我有点困惑。骗子似乎涵盖了问题中的所有内容以及答案。请问这是什么问题?
  • @cigien:在我看来,提议的欺骗是关于用a = not a 替换if a then a = false else a = true。显然,这个 OP 知道这一点,因为这就是他们的代码所做的。 OP 追求的是一种在一个源代码中做几件事的方法,我认为这是一个不同的问题。
  • 好吧,这很合理。我也添加了自己的解决方案 :)
【解决方案3】:

我认为你拥有它的方式很好,但另一种方式是这样的:

unsigned int count = 0;

while(true) {
   std::cout << ((++count%2) != 0) << std::endl;
}

【讨论】:

  • 我们真的应该指出,如果优化器无法为我们修复它,这种替代方法可能会导致代码慢约 7 倍。 / 除法运算非常慢(通常为 5 个时钟周期左右),而 % 模运算包含除法。此外,我们使用的内存超出了必要。此外,它的可读性较差。
  • @Elliott 现代优化器会认识到((x%2)!=0) 可以更有效地实现为((x&amp;0x01)!=0),因此不应该有任何性能损失。至于可读性,我认为你是对的。
【解决方案4】:

从c++20开始,可以写:

for (auto b : std::views::iota(1)) 
{
    std::cout << b % 2 << std::endl;
}

这是demo

【讨论】:

    【解决方案5】:

    如果你想把事情复杂化,这里是“企业版”:

    #include <iostream>
    
    class SwitchingBool
    {
        bool state_{};
    public:
        operator bool()   const noexcept { return state_; }
        bool operator()()       noexcept { return (state_ = !state_); }
        // Or use a named accessor or a named mutator or invert the bodies or ...
    };
    
    int main()
    {
        SwitchingBool blinker;
        
        std::cout << std::boolalpha;
        for (int i{}; i < 10; ++i)
        {
            std::cout << "From " << blinker << " to " << blinker() << '\n';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2022-12-14
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多