早上起来拿手机耍了一下,突然发觉一篇关于运算符结合顺叙的贴子,关键是有一部分我不是很懂。没办法,自己动手,先看看代码:
1 #include <stdio.h> 2 3 int main(void) 4 { 5 char *a = "ace"; 6 printf("%c ", *a); 7 printf("%p ", a); 8 9 char b = *a++; 10 printf("%c ", b); 11 printf("%p ", &b); 12 //printf("%p ", p); carefully!!!! 13 14 printf("%c ", *a); 15 printf("%p ", a); 16 17 return 0; 18 } 19 20 /******************************* 21 * result: 22 * a 23 * 0x400670 24 * a 25 * 0x7ffe87ed2417 26 * c 27 * 0x400671 28 * ****************************/
是的,其实关键是这一句:char b = *a++; ,从输出来看,b 等于字符 a,与*a 的结果一样。那说明*a++中的++效果并没有对b起作用。在*a++后,我再将*a输出,果然,结果为字符c了。从地址来看,在*a++后的,a的地址也向后移动了1(char占一个字节) 。
理论分析:其实在*a++中,* 与 ++ 的运算级别是一样的,而且是右结合的。在语句b = *a++ 中,因为右结合,所以先算a++,在算*a,要注意的是,a++的用法与++a是不一样的。例如在*a++中,详细过程是这样的:a 先被创建一个临时的副本|a|,然后将原本的a执行a++,再对副本用*运算符即*|a|,最后将*|a| 复制给 变量 b。