牛人们在标准库中的写法,以不可读性换取效率:
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;
}
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