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 运算符进入函数...
一个有趣而简洁的技巧,供将来记住。
谢谢!
我正在查看一些专为使用串行闪存而设计的 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 运算符进入函数...
一个有趣而简洁的技巧,供将来记住。
谢谢!