请考虑以下代码:
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?
答案 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)));