(*p)++ 与 *p++ 与 ++*p 拨开一团迷雾
(*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 simplevoid 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
|
|
(*p)++ 与 *p++ 与 ++*p 拨开一团迷雾的更多相关文章
- [C语言](*p)++ 与 *p++ 与 ++*p 拨开一团迷雾
环境:win7 IDE:DEV-C++ 编译器:GCC 1.先说++i和i++的基础 代码如下: #include <stdio.h> //just change simple void ...
- 负载均衡 IO etc.
IO多路复用之epoll总结 ↑2013年8月21日11:49:44 EPOLL下的accept(不错的blog) 关于TCP封包.粘包.半包 linux内核TCP相关参数解释 ↑2013年8月14日 ...
- 拨开字符编码的迷雾--MySQL数据库字符编码
拨开字符编码迷雾系列文章链接: 拨开字符编码的迷雾--字符编码概述 拨开字符编码的迷雾--编译器如何处理文件编码 拨开字符编码的迷雾--字符编码转换 拨开字符编码的迷雾--MySQL数据库字符编码 1 ...
- [App]Xamarin First(Or Last One) App
这个应用简单得无以复加,主要是熟悉了使用Xamarin Studio进行Android开发的配置和基本流程. 以前未曾具体得做过App开发,现在大致了解了开发所包含的基本元素. 如上图,在Layout ...
- AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...
- AfNetworking 3.0源码解读
做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...
- JDK动态代理[1]----代理模式实现方式的概要介绍
日常工作中经常会接触到代理模式,但一直没有对其进行深究.代理模式一直就像一团迷雾一样存在我心里,什么是代理模式?为什么要使用代理?代理模式有哪些实现?它的底层机制是怎样的?这些问题促使着我迫切想要揭开 ...
- 杂项-分布式-EDAS:深度解析阿里云EDAS服务
ylbtech-杂项-分布式-EDAS:深度解析阿里云EDAS服务 1.返回顶部 1. 深度解析阿里云EDAS服务 弹性伸缩 摘要: 第一种只适用于业务较少的情况,而在新业务不断增加的情况下,增加新应 ...
- Unity3d之MonoBehavior自带方法的执行顺序
首先贴一张图(从其他地方摘录的,不记得出处,如果有小伙伴知道可以评论留言) 看了以后脑子有个大概的概念,可还是一知半解的感觉(接触Unity也有2年之久,却从来没想过弄清楚心中这团迷雾,总是囫囵吞枣用 ...
随机推荐
- 深入理解PHP中赋值与引用
原文:深入理解PHP中赋值与引用 先看下面的问题: <?php $a = 10;//将常量值赋给变量,会为a分配内存空间 $b = $a;//变量赋值给变量,是不是copy了一份副本,b也分配了 ...
- Windows Phone 8.1 多媒体(1):相片
原文:Windows Phone 8.1 多媒体(1):相片 Windows Phone 8.1 多媒体(1):相片 Windows Phone 8.1 多媒体(2):视频 Windows Phone ...
- 【ThinkingInC++】66、pointer Stash的使用
头文件PStash.h /** * 书本:[ThinkingInC++] * 功能:pointer Stash的头文件 * 时间:2014年10月5日14:33:15 * 作者:cutter_poin ...
- asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化
原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息 在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...
- dom01
事件冒泡:即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的那个节点(文档). 事件捕获:即不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件. ...
- Linux C语言操作MySQL
原文:Linux C语言操作MySQL 1.MySQL数据库简介 MySQL是一个开源码的小型关系数据库管理系统,体积小,速度快,总体成本低,开源.MySQL有以下特性: (1) 使用C和C++编写, ...
- 一些javascript常用方法
1.输入一个正整数n,从1累加到n,返回结果.(如果输入为非正整数,如:小数.0.负数.NaN或其它非数字则返回false) function f(n){ return ~~+n == n & ...
- 快速构建Windows 8风格应用13-SearchContract构建
原文:快速构建Windows 8风格应用13-SearchContract构建 本篇博文主要介绍如何在应用中构建SearchContract,相应的原理已经在博文<快速构建Windows 8风格 ...
- [Elasticsearch] 集群工作 - 第二部分
本文翻译自Elasticsearch官方指南的life inside a cluster一章. 添加故障转移(Failover)功能 仅仅执行一个节点意味着可能存在着单点失败(Single point ...
- Asp.Net Identity 深度解析 之 注册登录的扩展
关于权限每个系统都有自己的解决方案,今天我们来讨论一下微软的权限框架Asp.Net Identity ,介绍如下 http://www.asp.net/identity 这里不在赘余. 很多人认为 ...