古怪的C++语法*p++=*q++

牛人们在标准库中的写法,以不可读性换取效率:

while (*p++=*q++);

1 分析

因为++在变量后面,变量q不会增加,一直到表达式被求值。

后置自增操作符++(优先级为1),优先级要高于解析引用操作符(优先级为2),高于赋值操作符。

后置自增操作符++(优先级为1),优先级要高于解析引用操作符(优先级为2)。


运算过程如下:

求右式的值:先将q值取出(此时为old_q),然后q自增1,最后取出地址old_q指向的值,右侧的值为2.

求左式的值:先将p值取出(此时为old_p),然后p自增1,最后取出地址old_p指向的值,将*old_q的值赋值给*old_p.

如果old_q指向的值为'\0',则循环结束


2 代码验证

#include "stdio.h"

void main()
{
    int a=2;
    int *q=&a;
        int *qold;
        qold = q;
        printf("原来的q=%x *q=%d\r\n",q, *q);

        int b = 1;
        int *p = &b;
        int *pold;
        pold = q;
        printf("原来的p=%x *p=%d\r\n", p, *p);
        
        int c = *q++;
        printf("地址变化的结果p-pold=%x ",q-qold);

    *p++ = c;

        printf("变化的q=%x *q=%d\r\n",q, *q);
        printf("变化的p=%x *p=%d *(p-1)=%d\r\n", p, *p, *(p-1));
}

输出结果

原来的q=12ff60 *q=2
原来的p=12ff3c *p=1
地址变化的结果p-pold=1 变化的q=12ff64 *q=-858993460
变化的p=12ff40 *p=-858993460 *(p-1)=2


3 应用

char * strcpy(char p, const char * q) {
while (*p++=*q++);
//there's also a return p; statement at the end
}

等效代码

while (true) {
    char* old_p = p;
    const char* old_q = q;

    ++p; // or p++;
    ++q; // or q++;

    *old_p = *old_q;
    if (*old_p == '\0')
        break;
}


4 参考文献

http://stackoverflow.com/questions/7249215/c-pointers-question

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=547

http://en.cppreference.com/w/cpp/language/operator_precedence


                
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值