关于运算符结合顺叙的一些小探索

早上起来拿手机耍了一下,突然发觉一篇关于运算符结合顺叙的贴子,关键是有一部分我不是很懂。没办法,自己动手,先看看代码:

 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。

原文地址:https://www.cnblogs.com/busui/p/5801506.html