如何在布尔值(假和真)上编写“for"循环
一个主要是为了好玩/好奇的问题:如何在 C++ 中编写一个 for
循环,该循环将遍历 bool
的两个值(即 true
和 false
),只使用带有 bool
的操作(即不转换为其他类型)?
A question mostly for fun/curiosity: how to write a for
loop in C++ that would iterate over two values of a bool
(i.e. true
and false
), using only operations with bool
(i.e. without conversions to other types)?
背景是我想检查像 (A && B) || 这样的方程存在多少解.(!B && !C && !D) == true
,并开始写类似 for (bool A=false; ??? ; ++A) for (bool B=false; ...)
等但立即被 ???
卡住 - 即继续循环的条件是什么?当然我重写了它以使用 int,而且我也知道 do ... while
循环会起作用,但我很好奇是否有可能编写这样的 for
循环?由于SO似乎没有答案,我决定问:)
The background is that I wanted to check how many solutions exists for an equation like (A && B) || (!B && !C && !D) == true
, and started to write something like for (bool A=false; ??? ; ++A) for (bool B=false; ...)
etc but immediately got stuck by ???
- i.e. what would be the condition to continue the loop? Of course I rewrote it to use int, and I also know that a do ... while
loop will work, but I got curious if it's ever possible to write such a for
loop? And since SO does not seem to have an answer, I decided to ask :)
更新:请注意,在至少两个现已删除的答案中建议的明显"变体 for(bool A=false; !A; A=true)
只会运行一次迭代,因为对于第二个条件 !A
变为 false
并且循环结束.
Update: note that an "obvious" variant for(bool A=false; !A; A=true)
suggested in at least two now-removed answers will only run one iteration, because for the second one the condition !A
becomes false
and the loop ends.
经过一番思考,我相信如果没有第二个变量或 Dietmar Kühl 建议的基于指针的构造,在 C++03 中是不可能做到的.该条件应在所需的执行中测试 3 次,因此两个布尔值是不够的.而 do-while 循环之所以有效,是因为第一次迭代是无条件执行的,条件只检查了两次,因此可以使用 bool 值在继续和退出之间进行选择.
After some pondering, I believe it's impossible to do it in C++03 without a second variable or a pointer based construct like suggested by Dietmar Kühl. The condition should be tested three times in a desired execution, so two values of a bool are simply not enough. And the do-while loop works because the first iteration is executed unconditionally, the condition is only checked twice and so a bool value can be used to select between continuing and exiting.
推荐答案
在 C++11 中:for (bool b : { false, true }) {/* ... */}
这是一个 C++03 版本:
Here's a C++03 version:
for (bool a = true, b = false; b != a; a = a && b, b = !b) { /*...*/ }
(使用 a
或 b
.)
相关文章