(*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
 
 
 
分类: C

(*p)++ 与 *p++ 与 ++*p 拨开一团迷雾的更多相关文章

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

    环境:win7 IDE:DEV-C++ 编译器:GCC 1.先说++i和i++的基础 代码如下: #include <stdio.h> //just change simple void ...

  2. 负载均衡 IO etc.

    IO多路复用之epoll总结 ↑2013年8月21日11:49:44 EPOLL下的accept(不错的blog) 关于TCP封包.粘包.半包 linux内核TCP相关参数解释 ↑2013年8月14日 ...

  3. 拨开字符编码的迷雾--MySQL数据库字符编码

    拨开字符编码迷雾系列文章链接: 拨开字符编码的迷雾--字符编码概述 拨开字符编码的迷雾--编译器如何处理文件编码 拨开字符编码的迷雾--字符编码转换 拨开字符编码的迷雾--MySQL数据库字符编码 1 ...

  4. [App]Xamarin First(Or Last One) App

    这个应用简单得无以复加,主要是熟悉了使用Xamarin Studio进行Android开发的配置和基本流程. 以前未曾具体得做过App开发,现在大致了解了开发所包含的基本元素. 如上图,在Layout ...

  5. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

    做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...

  6. AfNetworking 3.0源码解读

    做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...

  7. JDK动态代理[1]----代理模式实现方式的概要介绍

    日常工作中经常会接触到代理模式,但一直没有对其进行深究.代理模式一直就像一团迷雾一样存在我心里,什么是代理模式?为什么要使用代理?代理模式有哪些实现?它的底层机制是怎样的?这些问题促使着我迫切想要揭开 ...

  8. 杂项-分布式-EDAS:深度解析阿里云EDAS服务

    ylbtech-杂项-分布式-EDAS:深度解析阿里云EDAS服务 1.返回顶部 1. 深度解析阿里云EDAS服务 弹性伸缩 摘要: 第一种只适用于业务较少的情况,而在新业务不断增加的情况下,增加新应 ...

  9. Unity3d之MonoBehavior自带方法的执行顺序

    首先贴一张图(从其他地方摘录的,不记得出处,如果有小伙伴知道可以评论留言) 看了以后脑子有个大概的概念,可还是一知半解的感觉(接触Unity也有2年之久,却从来没想过弄清楚心中这团迷雾,总是囫囵吞枣用 ...

随机推荐

  1. ThinkPHP框架设计与扩展总结

    详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...

  2. MapGuide应用程序演示样例——你好,MapGuide!

    图 3‑4显示了基于MapGuide的Web应用程序的开发流程,整个开发流程能够分为五个阶段.图中,矩形代表任务,椭圆形被任务使用的或被任务创建的实体,箭头代表数据流. 1) 载入文件类型的数据,配置 ...

  3. 在windows下用C语言写socket通讯实例

    原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #in ...

  4. orleans开篇之hello world

    orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...

  5. How to:installshield安装包怎样才能出现选择路径的界面?

    原文:How to:installshield安装包怎样才能出现选择路径的界面? 这个问题新手问的很多,installshield的安装包默认设置下选择路径的界面藏在Custom安装类型下.在做完安装 ...

  6. Django查询的琐碎记录

    我的需求是这样的,获取指定用户的获“赞”总数. 用户 models.py class UserProfile(models.Model): user = models.OneToOneField(Us ...

  7. leetcode 第42题 Multiply Strings

    题目:Given two numbers represented as strings, return multiplication of the numbers as a string. Note: ...

  8. KNN算法的理解

    一.算法 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平庸的分类器或许是那种死记硬背式的分类器,记住全部的训练数据.对于新的数据则 ...

  9. C++ multimap容器访问同一键值元素的不同方法

    multimap是一种多元map容器,允许一个键对应多个值. 本文介绍了 multimap访问同一键值元素的三种不同方法,详细看下面代码: typedef multimap<string,int ...

  10. REDGATE又一好用的脚本工具

    REDGATE又一好用的脚本工具   REDGATE又一好用的脚本工具 先说明一下:这个工具是免费的 下载地址:http://www.red-gate.com/products/dba/sql-scr ...