C语言 *p++=*q++ 理解

优先级问题

经查表,首先 * 与 ++ 的优先级是一样的,根据编译原理应当遵守靠右的规则,所以
*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;
}

总结,很多内容其实都涉及到了编译的规则,有机会可以看看编译原理这本书,比如前++与后++, * 与++的优先级这样子。

  • 25
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值