在c ++中使用Boolean运算符

时间:2015-03-06 18:27:18

标签: c++ if-statement arduino logical-operators

我试图在我的程序中使用这个Arduino代码,LED将继续运行 持续5秒然后自动关闭

#include <elapsedMillis.h>

int led = 13 ;
elapsedMillis timer0 ;
#define interval 5000
boolean timer0Fired ;

// the setup routine runs once when you press reset:
void setup() 
{
    pinMode(led, OUTPUT);
    digitalWrite(led, HIGH);
    timer0Fired = false;
    timer0 = 0; // clear the timer at the end of startup
}

void loop()
{
    if ((!timer0Fired) && (timer0 > interval))
    {
        timer0Fired = true;      // don't execute this again
        digitalWrite(led, LOW);  // turn led off after 5 sec
    }
}

我不明白if语句在循环中是如何工作的,!timer0Fired应该计算为1,但是当我将它打印出来时它是0,所以当timer0超过 if语句应该计算为false,我在UNO上尝试它并且它可以工作。

2 个答案:

答案 0 :(得分:0)

  

!timer0Fired应评估为1,但是当我将其打印出来时   0

打印时,打印&#34;!timer0Fired&#34;或&#34; timer0Fired&#34;?它会解释输出。

  

所以当timer0超过间隔时,if语句应该计算   是假的

目前,&#34;(timer0&gt; interval)&#34;当timer0超过间隔时,计算结果为true,而不是相反。这不正确吗?

答案 1 :(得分:0)

这只是一个基本的编程逻辑。

想象一下,你想要数到5并调用一些函数,例如DoSomething,无限循环。

int count = 0;
bool called = false; // DoSomething not called yet

while (true) // main loop
{
    ++count;

    if (count == 5)
    {
        // the count is 5
        if (called == false)
        {
            // function not called yet, call it!
            called = true;
            DoSomething();
        }
    }
}

在某种程度上,这似乎是无意义的。等等......

然而,您遇到的问题是您没有像我的count这样的简单计数器。相反,您使用的计时器可能只有几毫秒的时间,而您仍然希望代码能够执行,即使它已经很晚了。

例如:

int count = 0;
bool called = false; // DoSomething not called yet

while (true) // main loop
{
    count += 2; // emulate counter being late

    if (count >= 5) // note that count == 5 will be always false here...
    {
        // the count is 5 or more
        if (called == false)
        {
            // function not called yet, call it!
            called = true;
            DoSomething();
        }
    }
}

现在完全颠倒了if的价值。这样,应用程序几乎总是通过第一个if,但只有一次。为了优化这一点,您只需交换if s:

即可
if (called == false)
{
    if (count >= 5)
    {
        called = true;
        DoSomething();
    }
}

现在,正如您可能知道的那样,这些嵌套的if语句可以使用&&运算符轻松地分组为一个。此外,使用called == false可以减少!called的详细程度。这最终导致了

while (true) // main loop
{
    count += 2; // emulate counter being late

    if (!called && count >= 5)
    {
        // function not called yet and count is already 5 or more
        called = true;
        DoSomething();
    }
}

所以发生了什么:
a)您只想执行一段代码一次
    - 在您的代码中由bool called = false; if (!called) called = true;逻辑或timer0fired表示

b)你想要延迟通话,直到某个计时器达到一定数量为止     - 在您的示例中由count >= 5timer >= interval表示

<强> TL;博士
您的代码运行正常。