优先级问题
经查表,首先 * 与 ++ 的优先级是一样的,根据编译原理应当遵守靠右的规则,所以
*p++ = *(p++);
i++与++i的区别
网上已经有很多帖子贴代码测试过了,这里我直接引用结论,那就是i++是先使用 i 后自增,而 ++i 是先自增后使用 i
引用上面2个结论,那么下面的代码会输出什么结果呢?
int a[] = {1,10,100};
int *p = &a;
printf("%d",*p++); //输出结果为1
printf("%d",*++p); //输出结果为100
p++ 分解步骤如下:
1、 首先与()优先级一样,所以 *(p++) 等价于 *p++ ,但是i++模式是先使用i的,所以应该先使用p,然后在对p进行自增操作
2、因此先取p的值,为1,打印出来
3、然后在对p++,即指针右移,指向10的位置
一句话解释 即temp = *p; p = p + 1;
*++p 分解步骤如下:
1、前面的 *p++ 已经导致指针右移到了10的位置
2、分解为 *(++p),这个时候使用括号是为了方便理解,按照++i模式,应该先对p进行自增,然后使用p
3、因此先执行++p 对指针p进行右移
4、然后对指针进行取值操作得到100,打印出来
一句话解释 即 p=p+1; temp=*p;
那么*p++ = *q++ 等价什么呢?
我们知道=的优先级是比++和*都要低的,所以步骤如下:
*q++;
*p++;
//经过上面变化后的指针p与q
*p = *q;
这个式子说白了就是将q的内容赋值给p。
经常用C的朋友肯定知道strcpy这个函数,他的源码如下:
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
throw "Invalid argument(s)";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
return strDestCopy;
}
总结,很多内容其实都涉及到了编译的规则,有机会可以看看编译原理这本书,比如前++与后++, * 与++的优先级这样子。