如何为bool值写入for循环(false和true)

主要是为了好玩/好奇的问题:如何在C ++中编写一个for循环,这个循环会遍历bool两个值(即truefalse ),仅使用bool操作(即不转换为其他types)?

背景是,我想检查一个方程如(A && B) || (!B && !C && !D) == true存在多less个解 (A && B) || (!B && !C && !D) == true ,并开始for (bool A=false; ??? ; ++A) for (bool B=false; ...)编写类似于for (bool A=false; ??? ; ++A) for (bool B=false; ...)卡住??? – 即继续循环的条件是什么? 当然我重写它使用int,而且我也知道一个do ... while循环将起作用,但是我好奇于是否有可能编写这样的for循环? 而且因为SO似乎没有答案,我决定问:)


更新:请注意,在至less两个现在删除的答案中提出的for(bool A=false; !A; A=true)的“显而易见的”变体将只运行一个迭代,因为对于第二个情况,条件!A变为false ,循环结束。

经过一番思考,我相信不可能在没有第二个variables或者像DietmarKühlbuild议的基于指针的构造的C ++ 03中完成它。 这个条件应该在期望的执行中testing三次,所以bool的两个值是不够的。 而do-while循环的工作原理是,第一次迭代是无条件执行的,条件只检查两次,所以可以使用布尔值来select继续和退出。

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

这是一个C ++ 03版本:

 for (bool a = true, b = false; b != a; a = a && b, b = !b) { /*...*/ } 

(使用ab

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

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

可能包装在一个macros观。 你也可以使用

 for (bool a: { false, true }) { use(a); } 
 for (int a = 0; a <= 1; a++) doStuff(a ? true : false); 

而忘记“没有其他types的转换”限制:)在一天结束时,清晰度比人为限制更重要。 五年后,你会阅读自己的代码,并想知道“我在想什么,这是一种模糊的比赛?

 a = true; do { use(a); a = !a; } while (!a); 

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

这个答案解决了“不可能的”C ++ 03,单variables解决scheme

首先,让我们确认,没有确定的算术expression式只依赖于一个inputvariables对于两个input都是true,false但是对于第三个必须是truefalse值,则不是。

但是,我们可以“欺骗”。 虽然,我会恳求你certificate我其实是在作弊。

 #include <iostream> using namespace std; int main() { for (bool b = false; *((char*)&b) != 2; *((char*)&b) += 1) { cout << "bool " << b << endl; } } 

这当然看起来像未定义的行为。 C ++ 03有点不清楚 。 但是, sizeof必须至less为1(对于0长度的var-len数组,非标准例外)。 而且,由于我们保证每个字符至less有8位,所以我们可以使用第二个字符作为我们的计数器。

事实上,要做到这一点,我们需要摆脱决定论(不能放弃保证,我们迭代false, true一次)或我们的约束types系统。

这也是一个作品:

 for (bool a = false, b = false; a == b; b = !b, a = a || b) { } 

(倒过来的解决scheme比@ KerrekSB的)

还有一个C ++ 03:

 for(bool a = false, b = true; b; a = !a, b = a) 

使用b。