C语言中的指针递增

C语言中的指针递增,c,pointers,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++)); 无符号短i; 无符号短a; 无符号字符*pInput=(无符号字符*)&i; p

考虑以下代码:

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++));
无符号短i;
无符号短a;
无符号字符*pInput=(无符号字符*)&i;
pInput[0]=0xDE;
pInput[1]=0x01;

a=((无符号短)(*pInput++)代码调用未定义的行为。原因是
pInput
在两个端口之间修改了不止一次。你可能会得到任何东西,无论是预期的还是意外的结果。没什么可说的

C99声明:

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

阅读以获得更详细的解释。

a=((无符号短)(*pInput++)到
pInput
的两个增量之间没有任何差异,这会引发未定义的行为

a = ((unsigned short)(*pInput++)) << 8 | ((unsigned short)(*pInput++));
将其切成序列如下所示:

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

a=((无符号短)(*pInput++)简言之(除其他错误外),不能保证左
pInput++
先执行,右
pInput++
后执行。换句话说,你在同一个表达式中修改了两次pInput,这在技术上被称为未定义的行为,即使恶魔从你鼻子里飞出来,你也不能抱怨。我想你倒过来了:a=((无符号短)(*pInput))
a = ((unsigned short)(*pInput)) << 8 | ((unsigned short)(*(pInput+1)));
a = ((unsigned short)(*pInput++)) << 8;
a |= ((unsigned short)(*pInput++));