如何在bool值上写一个`for`循环(false和true)

Ale*_*nov 47 c++ for-loop boolean

一个主要是为了好玩/好奇的问题:如何for在C++中编写循环,迭代两个a bool(ie truefalse)的值,只使用操作bool(即没有转换到其他类型)?

背景是我想检查一个等式有多少解决方案存在(A && B) || (!B && !C && !D) == true,并开始编写类似的东西,for (bool A=false; ??? ; ++A) for (bool B=false; ...)但立即被卡住???- 即继续循环的条件是什么?当然我把它重写为使用int,我也知道do ... while循环会起作用,但是如果有可能编写这样的for循环我很好奇吗?既然SO似乎没有答案,我决定问:)


更新:请注意,for(bool A=false; !A; A=true)在至少两个现在删除的答案中建议的"明显"变体将仅运行一次迭代,因为对于第二次迭代,条件!A变为false循环结束.

经过一番思考之后,我相信如果没有第二个变量或者像DietmarKühl建议的基于指针的构造,在C++ 03中这样做是不可能的.条件应该在期望的执行中测试三次,因此bool的两个值是不够的.do-while循环有效,因为第一次迭代是无条件执行的,条件只检查两次,因此可以使用bool值在继续和退出之间进行选择.

Ker*_* SB 59

在C++ 11中: for (bool b : { false, true }) { /* ... */ }


这是一个C++ 03版本:

for (bool a = true, b = false; b != a; a = a && b, b = !b) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

(使用ab.)


Die*_*ühl 7

当限于C++ 2003时,您可以使用大致相当于C++ 2011方法的方法;

{
  bool const bools[] = { false, true };
  for (bool const* it(bools); it != std::end(bools); ++it) {
      bool a(*it);
      use(a);
  }
}
Run Code Online (Sandbox Code Playgroud)

可能打包在一个宏.你也可以使用

for (bool a: { false, true }) {
    use(a);
}
Run Code Online (Sandbox Code Playgroud)


And*_*sky 5

for (int a = 0; a <= 1; a++)
  doStuff(a ? true : false);
Run Code Online (Sandbox Code Playgroud)

并且忘记"没有转换到其他类型"限制:)在一天结束时,清晰度比人为限制更重要.五年后,你将会阅读自己的代码并想知道"我在想什么,这是某种混淆比赛吗?"


小智 5

a = true;
do {
  use(a);
  a = !a;
} while (!a);
Run Code Online (Sandbox Code Playgroud)

好的,所以它不是一个for循环,但我认为它比任何 for 循环建议都更具可读性(当然,除了 C++11 方法)。