在读取时增加指针?

时间:2015-12-17 06:55:39

标签: c++ arduino

以下代码来自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个问题;

  1. 普通C / C ++编译器中的序列是什么,Arduino中的序列是什么?首先读取值,然后指针递增?或者是相反的方式?
  2. C / C ++编译器的序列是否始终相同或是否相同 他们之间有什么不同?

4 个答案:

答案 0 :(得分:2)

由C ++标准定义,并且:

  1. 它是一样的(在这种情况下它的后增量所以它会在从p读取值后发生)
  2. 始终如一。

答案 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;
}