指针在C中递增

时间:2014-03-17 13:34:14

标签: c pointers

请考虑以下代码:

unsigned short i;
unsigned short a;
unsigned char *pInput = (unsigned char *)&i;

pInput[0] = 0xDE;
pInput[1] = 0x01;

a = ((unsigned short)(*pInput++)) << 8 | ((unsigned short)(*pInput++));

为什么a的值是0xDEDE,而不是0xDE01?

3 个答案:

答案 0 :(得分:5)

代码调用未定义的行为。原因是pInput在两个sequence points之间不止一次修改。您可能得到任何预期或意外结果。什么都不能说。

C99声明:

  

在上一个和下一个序列点之间,对象的存储值最多只能通过表达式的修改一次修改。此外,只能访问先前值以确定要存储的值。

阅读c-faq 3.8以获取更详细的说明。

答案 1 :(得分:1)

pInput的两个增量之间没有sequence points,这会引发未定义的行为。

将其剪切为序列,如下所示:

a = ((unsigned short)(*pInput++)) << 8;
a |= ((unsigned short)(*pInput++));

答案 2 :(得分:0)

a = ((unsigned short)(*pInput++)) << 8 | ((unsigned short)(*pInput++));

您正在使用后增量,执行该行后将应用++。

a将采用与执行相同的值:

a = ((unsigned short)(*pInput)) << 8 | ((unsigned short)(*pInput));

如果你想要它是0xDE01,你必须这样做:

a = ((unsigned short)(*pInput)) << 8 | ((unsigned short)(*(pInput+1)));