【问题标题】:NOT operator on Boolean in c++C ++中布尔值的NOT运算符
【发布时间】:2015-03-06 18:27:17
【问题描述】:

我正在尝试在我的程序中使用此 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 语句的计算结果应为假,我在 UNO 上尝试过,它可以工作。

【问题讨论】:

  • 您可能打印错了。你是怎么打印出来的?
  • 是否曾经调用setup() 来初始化timer0Fired?如果未初始化,它将有一个来自随机内存的垃圾值,因此如果!timer0Fired 有任何非零值,它将评估为0。
  • timer0Fired 没有初始化,是吗?
  • 你能发布一个 MCVE 吗?
  • @ichramm:全局变量和静态变量默认为零初始化。

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


【解决方案1】:

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

打印时是打印“!timer0Fired”还是“timer0Fired”?它将解释输出。

所以当 timer0 超过间隔时 if 语句应该评估 是假的

目前,当 timer0 超过时间间隔时,“(timer0 > interval)”的计算结果为真,而不是相反。对不对?

【讨论】:

    【解决方案2】:

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

    想象你想数到 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();
            }
        }
    }
    

    现在这完全反转了ifs 的值。这样,应用程序几乎总是通过第一个if,但只通过第二个一次。为了优化这一点,您可以交换ifs:

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

    现在,您可能知道,这些嵌套的if 语句可以使用&amp;&amp; 运算符轻松组合为一个。此外,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 &gt;= 5 或 timer &gt;= interval 表示

    tl;博士
    您的代码运行正常。

    【讨论】:

    • 感谢 Alegnem,您的解释再清楚不过了
    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 2012-02-19
    • 1970-01-01
    • 2013-03-02
    • 2012-09-20
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多