我有一个 do-while 循环,每次它的状态(例如通过/失败)发生变化时需要记录一次消息(所以它不会使日志混乱),但每次通过循环时仍然需要做其他事情. 使用一个简单的布尔变量基本上可以告诉您是否已经记录了该消息,一旦您处于已知条件,该消息就会起作用。但是,如果您希望在任何一种情况下都第一次打印消息(通过/失败),您必须考虑到这一点。例如,如果您将条件默认为true
,并且实际上第一次为真,则它不会记录它认为已经为真的“真”消息 b/c(反之亦然 ic 假) .
对于 ic=Null 的可空布尔值来说,这似乎是一个好地方,但是在那些不存在的语言中,该怎么办?
我能想到的最简单的解决方案是使用一个额外的布尔变量,比如“firstTime = True”,但是当我觉得应该有一种更微妙的方法来处理它时,使用它作为一种基本的解决方法总是困扰着我。另一种选择是使用 do-while 的突破条件作为您用作条件的任何变量的初始条件,但是当有人阅读时这可能会令人困惑int status = STATUS_QUIT
,而且它肯定需要比bool firstTime = true
. 第三种选择是使用枚举而不是 bool 并具有 {firstTime, true, false} 或其他内容。
是否有其他原因使用其中一个,或者有更好的方法吗?
我想出了两个选项的代码示例:
使用bool firsttime
:
bool firstTime = true, infoFound = false;
do
{
if (getInfo())
{
if (!infoFound)
{
// log it (ONCE)(important)
infoFound = true;
}
// use info (every time)
}
else if (infoFound || firstTime)
{
// log it (ONCE)(important)
infoFound = false;
firstTime = false;
}
// FYI, WaitForStatusUpdate is a blocking call...
} while (STATUS_QUIT != WaitForStatusUpdate());
使用while
循环“中断条件”作为检查变量的初始条件:
(status
在 do-while 结束时更新,因此该do
部分将不再执行 if status == breakOutCondition
;我们可以在这里利用它来发挥我们的优势最初设置status = breakOutContition
- 第一次通过它,breakOutCondition
但任何后续循环都会是别的东西......仍然不确定我是否喜欢这个,因为它是一种黑客......
bool infoFound = false;
int status = STATUS_QUIT;
do
{
if (getInfo())
{
if (!infoFound)
{
// log it (ONCE)(important)
infoFound = true;
}
// use info (every time)
}
else if (infoFound || firstTime)
{
// log it (ONCE)(important)
infoFound = false;
}
status = WaitForStatusUpdate();
} while (STATUS_QUIT != status);
(我将其标记为 c++,因为这就是我正在使用的,但这确实适用于任何具有类似结构的语言)