[C语言](*p)++ 与 *p++ 与 ++*p 拨开一团迷雾

环境:win7

IDE:DEV-C++

编译器:GCC

 

1.先说++i和i++的基础

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
//just change simple
void stop(void)
{
    system("pause");    
}
 
int main(void)
{
    int i = 1;
    printf("i++ = %d\n",i++);
    printf("i = %d\n",i);
     
    int j = 1;
    printf("++j = %d\n",++j);  
    printf("j = %d\n",j);
     
    printf("i++ = : %d   ++i = %d\n",i++,++i);
    printf("i = %d\n",i);
    printf("++j = : %d   j++ = %d\n",++j,j++);
    printf("j = %d\n",j);
    stop();
    return 0;
}

 运行结果:

1 i++ = 1
2 i = 2
3 ++j = 2
4 j = 2
5 i++ = : 3   ++i = 3
6 i = 4
7 ++j = : 4   j++ = 2
8 j = 4

1)i++只有遇到";"分号才会影响i的值, i++输出的值还是1,i的值也是1

2)i经过分号之后,i=2,因为自增了

3)++j不管遇到不遇到分号";"都会影响j值和++j值,所以J=2

4)j的值也是2

5)根据编译器的不同和操作系统的不同,printf计算方向也不同,这是从右开始计算,先++i,再i++,所以输出3 和3

6)最后一个i++遇到了分号,所以i=4

7)从右开始计算,j打印的结果还是2,但是第二次取出来的值是3,所以++j=4

 

2.理清概念  *p++ 中 *和++的优先级

复制代码
 1 #include <stdio.h>
 2 
 3 //just change simple
 4 void stop(void)
 5 {
 6       system("pause");     
 7 }
 8 
 9 int main(void)
10 {
11      int i = 5;
12      int *p;
13      p = &i;
14      printf("1-p = %d\n",p);
15      int v;
16     v = *p++; 
17      printf("v = %d\n",v); 
18      printf("2-p = %d\n",p);
19      printf("i = %d\n",i); 
20      system("pause");
21      return 0;
22 }
复制代码

运行结果:

1 1-p = 2686788
2 v = 5
3 2-p = 2686792
4 i = 5

从结果来看++符号影响了p的值并没有影响i的值,好像++的优先级要高于 指针*符号

 

再看例子

复制代码
 1 #include <stdio.h>
 2 
 3 //just change simple
 4 void stop(void)
 5 {
 6       system("pause");     
 7 }
 8 
 9 int main(void)
10 {
11      int i = 5;
12      int *p;
13      p = &i;
14      printf("1-p = %d\n",p);
15      int v;
16     v = ++*p; 
17      printf("v = %d\n",v); 
18      printf("2-p = %d\n",p);
19      printf("i = %d\n",i); 
20      system("pause");
21      return 0;
22 }
复制代码

运算结果:

1 1-p = 2686784
2 v = 6
3 2-p = 2686784
4 i = 6

怎么++不影响p的值了?

 

再看例子

把 代码稍微调整:v = *++p;

运算结果:

1 1-p = 2686788
2 v = 2686840
3 2-p = 2686792
4 i = 5

啊额,原来 * 和++优先级是同一级别,同一级别按照从右往左的顺序计算。

 

OK了,渐渐的所有问题都解决了,

*(p++) 

*(++p)

(*p)++

++(*p)应该没有问题了

迷雾终于拨开了。。。

1
 

 

posted @   Anleb  阅读(21843)  评论(22编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示