请看下面的代码:
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?
这两个对 pInput
的增量之间没有序列点(sequence points),这会导致未定义的行为。
将其切分成序列,如下所示:
a = ((unsigned short)(*pInput++)) << 8;
a |= ((unsigned short)(*pInput++));
a = ((unsigned short)(*pInput++)) << 8 | ((unsigned short)(*pInput++));
你正在使用后置递增,++会在该行代码执行完毕后再应用。
如果执行以下操作,a将取相同的值:
a = ((unsigned short)(*pInput)) << 8 | ((unsigned short)(*pInput));
a = ((unsigned short)(*pInput)) << 8 | ((unsigned short)(*(pInput+1)));
pInput++
先执行,右侧的pInput++
后执行。换句话说,在同一表达式中修改了两次 pInput,这在技术上被称为“未定义行为”,即使你的鼻子里飞出恶魔,也不能抱怨。 - Shahbaz