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

if statement conditional flow using ! operator

我正在查看一些专为使用串行闪存而设计的 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" 函数的定义方式以及它 returns 一个布尔值的事实有关,但我似乎无法理解如何这有助于 writeData 函数连续接受输入以写入内存芯片?

我在此处的逻辑中遗漏了一些内容。

我知道这可能令人困惑 post...希望有人清楚 ;0

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

所以,这就是它所说的。

// return false if all the data was not written

条件就是看是否"all the data was not written".

if中的代码仅在"all the data was not written"时执行。

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

闪存中有日志文件,用变量表示dataFile:

 lengthWritten = dataFile.write (buf, wrlen);

只要有 space 可用,对 dataLogger.writeData 的调用就会 return 为真。

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

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

我认为在调用日志函数之前(在 if (logging) { 之前的某处)应该检查 flashFull 以防止向串行端口打印太多错误。

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

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

谢谢!