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++));