if语句条件流使用!操作者

时间:2016-06-14 18:08:00

标签: if-statement arduino conditional

我正在研究一些专门用于处理串行闪存的Arduino兼容代码,但是我遇到了一个关于if()语句和程序条件流的更普遍的问题。这是一种我以前从未见过的新技术。可以在此处访问原始代码:https://github.com/LAtimes2/DataLogger/blob/master/DataLogger.ino

这段代码运行正常,并且做了它打算做的事情,这不是问题所在......仅供参考。

我很难理解的代码,在void loop()中如下:

logging = true;
    if (logging) {
          logString = valueToLogString (temperature, currentTime);

          if (!dataLogger.writeData (logString.c_str(), logString.length())) {
            if (!flashFull) {
              Serial.print ("Flash data is full - stopped writing\n");
              flashFull = true;
            }
          }
          // also print to serial port
          Serial.print(logString);
        }
      }

上面代码中调用的函数dataLogger.writeData如下:

bool SerialFlashDataLogger::writeData (const void *buf, uint32_t wrlen) {

  uint32_t lengthWritten = 0;

  lengthWritten = dataFile.write (buf, wrlen);

  // return false if all the data was not written
  return (lengthWritten == wrlen);
}

我很难理解if()语句:

  

if(!dataLogger.writeData(logString.c_str(),logString.length()))

代码用于连续记录数据,为什么会有if(!dataLogger.writeData .....) - 它读取if(“NOT”dataLogger.writeData ....)

我认为这与定义“writeData”函数的方式以及它返回布尔值的事实有关,但我似乎无法理解这有助于writeData函数持续接受输入为了写入内存芯片?

我在逻辑中缺少一些东西。

我知道这可能是一个令人困惑的帖子......希望有人能说清楚; 0

4 个答案:

答案 0 :(得分:0)

expr类型为bool时,if (!expr)if (!expr == true)if (expr == false)相同。

所以,它说的是什么。

// return false if all the data was not written

然后条件是查看"是否所有数据都未写入"。

if中的代码仅在"所有数据未写入"时执行。

答案 1 :(得分:0)

writeData函数返回一个布尔值,你可以看到bool SerialFlashDataLogger::writeData。这个布尔值告诉你是否所有数据都已被写入,所以你可以在条件语句中的布尔表达式中使用它

答案 2 :(得分:0)

闪存中有一个日志文件,由变量dataFile

表示
 lengthWritten = dataFile.write (buf, wrlen);

只要有可用空间,对dataLogger.writeData的调用将返回true。

一旦磁盘已满,对dataFile.write的调用将最终写入少于请求的字节,因此,dataLogger.writeData将返回false:

// return false if all the data was not written
return (lengthWritten == wrlen);

我认为在调用日志记录功能(flashFull之前的某个地方)之前应该检查if (logging) {,以防止向串口输出太多错误。

答案 3 :(得分:0)

感谢您的帮助...现在这很有意义......我在理解其工作原理时缺少的那部分与writeData函数被称为FIRST的概念有关,然后在内部记录数据在该函数中,然后评估它是返回FALSE还是TRUE,然后用NOT反转,如果在反转后评估为False则传递...我不清楚输入如何可以使用NOT运算符进入函数...

为将来记住一个有趣而简洁的技巧。

谢谢!