以下代码来自Arduino" Print.cpp":
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: Client.User
size_t Print::print(const __FlashStringHelper *ifsh)
{
PGM_P p = reinterpret_cast<PGM_P>(ifsh);
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
n += write(c);
}
return n;
}
基本上是一个char数组或字符串文字,它存储在PROGMEM(程序存储器)中而不是RAM中。它在WString.h中声明:
__FlashStringHelper
我对class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
行以及unsigned char c = pgm_read_byte(p++);
部分更感兴趣。我假设这里读取指针p的值,并且这里也增加一个字节,以便可以一个接一个地读取* ifsh中的所有字节。我对此是否正确?
考虑到上述情况,我有2个问题;
答案 0 :(得分:2)
由C ++标准定义,并且:
p
读取值后发生)答案 1 :(得分:2)
表达式pgm_read_byte(p++)
相当于
pgm_read_byte(p);
p += 1;
遵循该标准的所有C或C ++编译器都将采用这种方式。
答案 2 :(得分:1)
关于第二个问题,这是来自c89标准:
postfix ++运算符的结果是操作数的值。获得结果后,操作数的值会递增。
我不知何故相信所有较新的c版本以及cpp。
都是如此Arduino使用avr-gcc编译器。所以我猜你可以安全地假设:
A = p ++等于A = p;的p ++;
答案 3 :(得分:1)
后增量运算符(即变量++)将增加变量但返回变量的旧值。它相当于:
SomeType PostIncrement(SomeType& v)
{
SomeType oldValue = v;
v = v + 1;
return oldValue;
}
示例:
int x = 5;
int y = x++;
// Here x is 6 while y is 5 (i.e. the old value of x)
当您在函数调用中传递的变量使用后递增时,将使用旧值调用该函数。仍然在函数调用之前完成增量,因为在调用之前将完全评估参数。
示例:
void f(int y)
{
// When execution arrives here, x is 6 while y is 5 (i.e. the old value of x)
}
int main()
{
int x = 5;
f(x++);
return 0;
}