c语言运算符自增运算符

C语言中6组指针和自增运算符结合方式的运算顺序问题
作者:xingjiarong
字体:[ ] 类型:转载 时间:
本文通过代码实现分析了6种组合:* p++,(* p)++,* (p++),++* p,++( * p), * (++p),需要的朋友可以参考下
在C语言中,当指针运算符和++或者–结合时很容易分不清运算顺序,在这里总结一下,下面一共分析6中组合: * p++,(* p)++,* (p++),++* p,++( * p), * (++p)。
先看段代码以及输出:
#include&stdio.h&
int main()
int a[3]={1,3,5};
printf("----------------1----------------\n");
printf("%d\n",*p++);
printf("%d\n",*p);
for(i=0;i&3;i++)
printf("%d ",a[i]);
printf("\n");
printf("----------------2----------------\n");
p=a;//reset data
printf("%d\n",(*p)++);
printf("%d\n",*p);
for(i=0;i&3;i++)
printf("%d ",a[i]);
printf("\n");
printf("----------------3----------------\n");
a[0]=1;//reset data
printf("%d\n",*(p++));
printf("%d\n",*p);
for(i=0;i&3;i++)
printf("%d ",a[i]);
printf("\n");
printf("----------------4----------------\n");
printf("%d\n",++*p);
printf("%d\n",*p);
for(i=0;i&3;i++)
printf("%d ",a[i]);
printf("\n");
printf("----------------5----------------\n");
printf("%d\n",++(*p));
printf("%d\n",*p);
for(i=0;i&3;i++)
printf("%d ",a[i]);
printf("\n");
printf("----------------6----------------\n");
printf("%d\n",*(++p));
printf("%d\n",*p);
for(i=0;i&3;i++)
printf("%d ",a[i]);
printf("\n");
输出结果是这样的:
第一组:*p++,它的运算顺序是先返回 *p的值,然后p再++。
第二组:(*p)++,他的运算顺序是先返回 *p的值,然后 *p的值再++,这一点从运算后的数组a的值可以看出来。
第三组:*(p++),运算顺序是先返回 *p的值,然后p再++,也就是说它和 *p++的运算顺序一样。
这三组都是先返回 *p的值,区别就在于到底是p++还是 *p的值++。
第四组:++*p,先将 *p的值++,然后再返回 *p的值。
第五组:++(*p),先将 *p的值++,然后再返回 *p的值,所以它和++ *p是一样的。
第六组: * (++p),先将p的值++,然后再返回 * p的值,和 *++p是等价的。
这三组的特点是最后都是返回 *p的值,不同点在于是 *p先++还是p++。
以上就是本文的全部内容,希望大家可以喜欢。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C语言中的运算符&详细说明
无论是加减乘除还是大于小于,都需要用到运算符,在C语言中的运算符和我们平时用的基本上都差不多。
运算符包括赋值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算符、关系运算符、自增自减运算符。大多数运算符都是二目运算符,即运算符位于两个表达式之间。单目运算符的意思是运算符作用于单个表达式。(具体什么是表达式下一节再说)
一、赋值运算符
&&&&赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为‘=’。这里并不是等于的意思,只是赋值,等于用‘==’表示。
&&&&注意:赋值语句左边的变量在程序的其他地方必须要声明。
&&&&得已赋值的变量我们称为左值,因为它们出现在赋值语句的左边;产生值的表达式我们称为右值,因为她它们出现在赋值语句的右边。常数只能作为右值。
&&&&例如:
&&&&&&&&count=5;
&&&&&&&&total1=total2=0;
&&&&第一个赋值语句大家都能理解。&&&&
&&&&第二个赋值语句的意思是把0同时赋值给两个变量。这是因为赋值语句是从右向左运算的,也就是说从右端开始计算。这样它先total2=0;然后total1=total2;那么我们这样行不行呢?
&&&&&&&&(total1=total2)=0;
&&&&这样是不可以的,因为先要算括号里面的,这时total1=total2是一个表达式,而赋值语句的左边是不允许表达式存在的。
二、算术运算符
&&&&在C语言中有两个单目和五个双目运算符。
&&&&&&&符号&&&功能
&&&&&&&&+&&&单目正
&&&&&&&&-&&&单目负
&&&&&&&&*&&&乘法
&&&&&&&&/&&&除法
&&&&&&&&%&&&取模
&&&&&&&&+&&&加法
&&&&&&&&-&&&减法
&&&&下面是一些赋值语句的例子,&在赋值运算符右侧的表达式中就使用了上面的算术运算符:
&&&&&&&&Area=Height*W
&&&&&&&&num=num1+num2/num3-num4;
&&&&运算符也有个运算顺序问题,先算乘除再算加减。单目正和单目负最先运算。
&&&&取模运算符(%)用于计算两个整数相除所得的余数。例如:
&&&&&&&&a=7%4;
&&&&最终a的结果是3,因为7%4的余数是3。
&&&&那么有人要问了,我要想求它们的商怎么办呢?
&&&&&&&&b=7/4;
&&&&这样b就是它们的商了,应该是1。
&&&&也许有人就不明白了,7/4应该是1.75,怎么会是1呢?这里需要说明的是,当两个整数相除时,所得到的结果仍然是整数,没有小数部分。要想也得到小数部分,可以这样写7.0/4或者7/4.0,也即把其中一个数变为非整数。
&&&&那么怎样由一个实数得到它的整数部分呢?这就需要用强制类型转换了。例如:
&&&&&&&&a=(int)&(7.0/4);
&&&&因为7.0/4的值为1.75,如果在前面加上(int)就表示把结果强制转换成整型,这就得到了1。那么思考一下a=(float)&(7/4);最终a的结果是多少?
&&&&单目减运算符相当于取相反值,若是正值就变为负值,若是负数就变为正值。
&&&&单目加运算符没有意义,纯粹是和单目减构成一对用的。
三、逻辑运算符
&&&&逻辑运算符是根据表达式的值来返回真值或是假值。其实在C语言中没有所谓的真值和假值,只是认为非0为真值,0为假值。
&&&&&&&符号&&&功能
&&&&&&&&&&&&&&逻辑与
&&&&&&&&||&&&&逻辑或
&&&&&&&&!&&&&
~ &&& 求反
&&&&例如:
&&&&&&&&5!3;
&&&&&&&&0||-2&&5;
&&&&&&&&!4;
表达式进行&&运算时,只要有一个为假,总的表达式就为假,只有当所有都为真时,总的式子才为真。当表达式进行||运算时,只要有一个为
真,总的值就为真,只有当所有的都为假时,总的式子才为假。逻辑非(!)运算是把相应的变量数据转换为相应的真/假值。若原先为假,则逻辑非以后为真,若
原先为真,则逻辑非以后为假。
&&&&还有一点很重要,当一个逻辑表达式的后一部分的取值不会影响整个表达式的值时,后一部分就不会进行运算了。例如:
&&&&&&&&a=2,b=1;
&&&&&&&&a||b-1;
&&&&因为a=2,为真值,所以不管b-1是不是真值,总的表达式一定为真值,这时后面的表达式就不会再计算了。
四、关系运算符
&&&&关系运算符是对两个表达式进行比较,返回一个真/假值。
&&&&&&&符号&&&功能
&&&&&&&&&&&&&大于
&&&&&&&&&&&&&小于
&&&&&&&&&=&&&&大于等于
&&&&&&&&&=&&&&小于等于
&&&&&&&&==&&&&等于
&&&&&&&&!=&&&&不等于
&&&&这些运算符大家都能明白,主要问题就是等于==和赋值=的区别了。
&&&&一些刚开始学习C语言的人总是对这两个运算符弄不明白,经常在一些简单问题上出错,自己检查时还找不出来。看下面的代码:
&&&&&&&if(Amount=123)&……
多新人都理解为如果Amount等于123,就怎么样。其实这行代码的意思是先赋值Amount=123,然后判断这个表达式是不是真值,因为结果为
123,是真值,那么就做后面的。如果想让当Amount等于123才运行时,应该if(Amount==123)&……
五、自增自减运算符
&&&&这是一类特殊的运算符,自增运算符++和自减运算符--对变量的操作结果是增加1和减少1。例如:
&&&&&&&&--C
&&&&&&&&Couter--;
&&&&&&&&++A
&&&&&&&&Amount++;
这些例子里,运算符在前面还是在后面对本身的影响都是一样的,都是加1或者减1,但是当把他们作为其他表达式的一部分,两者就有区别了。运算符放在变量前
面,那么在运算之前,变量先完成自增或自减运算;如果运算符放在后面,那么自增自减运算是在变量参加表达式的运算后再运算。这样讲可能不太清楚,看下面的
&&&&&&&num1=4;
&&&&&&&num2=8;
&&&&&&&a=++num1;
&&&&&&&b=num2++;
&&&a=++num1;
这总的来看是一个赋值,把++num1的值赋给a,因为自增运算符在变量的前面,所以num1先自增加1变为5,然后赋值给a,最终a也为5。
b=num2++;这是把num2++的值赋给b,因为自增运算符在变量的后面,所以先把num2赋值给b,b应该为8,然后num2自增加1变为9。
&&&那么如果出现这样的情况我们怎么处理呢?
&&&&&&&&c=num1+++num2;
&&&到底是c=(num1++)+num2;还是c=num1+(++num2);这要根据编译器来决定,不同的编译器可能有不同的结果。所以我们在以后的编程当中,应该尽量避免出现上面复杂的情况。
六、复合赋值运算符
&&&&在赋值运算符当中,还有一类C/C++独有的复合赋值运算符。它们实际上是一种缩写形式,使得对变量的改变更为简洁。
&&&&&&&&Total=Total+3;
&&&&乍一看这行代码,似乎有问题,这是不可能成立的。其实还是老样子,'='是赋值不是等于。它的意思是本身的值加3,然后在赋值给本身。为了简化,上面的代码也可以写成:
&&&&&&&&Total+=3;
&&&&复合赋值运算符有下列这些:
&&&&&&&符号&&&&功能
&&&&&&&&+=&&&&加法赋值
&&&&&&&&-=&&&&减法赋值
&&&&&&&&*=&&&&乘法赋值
&&&&&&&&/=&&&&除法赋值
&&&&&&&&%=&&&&模运算赋值
&&&&&&&&&&=&&&左移赋值
&&&&&&&&&&=&&&右移赋值
&&&&&&&&&=&&&&位逻辑与赋值
&&&&&&&&|=&&&&位逻辑或赋值
&&&&&&&&^=&&&&位逻辑异或赋值
&&&&上面的十个复合赋值运算符中,后面五个我们到以后位运算时再说明。&&&&
么看了上面的复合赋值运算符,有人就会问,到底Total=Total+3;与Total+=3;有没有区别?答案是有的,对于A=A+1,表达式A被计
算了两次,对于复合运算符A+=1,表达式A仅计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达式作为函数的返回值时,函数就被
调用了两次(以后再说明),而且如果使用普通的赋值运算符,也会加大程序的开销,使效率降低。
七、条件运算符
&&&&条件运算符(?:)是C语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测,然后根据结果返回两外两个表达式中的一个。
&&&&&&&&&表达式1&?&表达式2&:&表达式3&
&&&&在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式2的值;如果为假,则返回表达式3的值。
&&&&例如:
&&&&&&&&a=(b&0)?b:-b;
&&&&当b&0时,a=b;当b不大于0时,a=-b;这就是条件表达式。其实上面的意思就是把b的绝对值赋值给a。
八、逗号运算符
&&&&在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
&&&&&&&假设b=2,c=7,d=5,
&&&&&&&&&&&a1=(++b,c--,d+3);
&&&&&&&&&&&a2=++b,c--,d+3;
于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3,为8,所以a=8。对于第二行代码,那么也是有三个表达
式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=3。
&&&还有其他的如位逻辑运算符,位移运算符等等,我们等到讲位运算时再说明。
九、优先级和结合性&&&&
&&&&从上面的逗号运算符那个例子可以看出,这些运算符计算时都有一定的顺序,就好象先要算乘除后算加减一样。优先级和结合性是运算符两个重要的特性,结合性又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算。
&&&&下面是C语言中所使用的运算符的优先级和结合性:
&&&&&优先级&&&&&&&&&运算符&&&&&&&&&&&&&&&&结合性
&&&&&(最高)&&&&&&&&()&[]&-&&.&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&!&~&++&--&+&-&*&&&sizeof&&&&自右向左
&&&&&&&&&&&&&&&&&&&&*&/&%&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&+&-&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&=&&&&=&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&==&!=&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&^&&&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&|&&&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&||&&&&&&&&&&&&&&&&&&自左向右
&&&&&&&&&&&&&&&&&&&&&?:&&&&&&&&&&&&&&&&&&自右向左
&&&&&&&=&+=&-=&*=&/=&%=&&=&^=&|=&&&=&&&=&自右向左
&&&&&(最低)&&&&&&&&&&,&&&&&&&&&&&&&&&&&&&自左向右
&&&&在该表中,还有一些运算符我们没有介绍,如指针运算符、sizeof运算符、数组运算符[]等等,这些在以后的学习中会陆续说明的。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C语言中自增自减运算符在表达式和函数中的应用--《电子测试》2014年09期
C语言中自增自减运算符在表达式和函数中的应用
【摘要】:C语言具有丰富的运算符,灵活运用这些运算符,可以提高程序的运行效率。其中自增、自减运算符的功能较为特别,是C语言中的一个语法难点部分,对于初学者来说是一个难点,也是容易出错的运算符。该文对Turbo C环境下的自增自减运算符在表达式和函数中的应用做一点探讨。
【作者单位】:
【关键词】:
【分类号】:TP312.1【正文快照】:
1自增、自减运算符的运算规则自增、自减的运算符符号:“++”为自增运算符;“--”为自减运算符。运算结果是使运算对象的值加1或减1。分为前缀形式和后缀形式。(1)前缀形式例如:①表达式“++i;”相当于“i=i+1;”,表示先使i的值加1,再使用变量i的值。②表达式“--i;”相当于“
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【相似文献】
中国期刊全文数据库
马红玲;;[J];甘肃科技纵横;2007年04期
雷萌;赵亚妮;;[J];软件导刊;2011年03期
王瀚波;任靖福;;[J];牡丹江教育学院学报;2005年04期
蔡春华;;[J];牡丹江师范学院学报(自然科学版);2009年02期
王鹏;沈艳秋;;[J];考试周刊;2011年44期
叶枫;;[J];自动化技术与应用;2008年03期
;[J];计算机工程与应用;1975年Z2期
韦建波;;[J];黑龙江科技信息;2011年02期
刘玉利;;[J];电脑知识与技术;2008年23期
刘玉利;;[J];电脑开发与应用;2009年08期
中国重要会议论文全文数据库
罗松涛;唐常杰;段磊;钟义啸;乔少杰;贠莹辉;;[A];第二十二届中国数据库学术会议论文集(研究报告篇)[C];2005年
林洁;谢潘庆;秦华;;[A];广西计算机学会2004年学术年会论文集[C];2004年
段磊;唐常杰;左劼;陈宇;钟义啸;元昌安;;[A];第二十一届中国数据库学术会议论文集(研究报告篇)[C];2004年
禹诚;;[A];2003年11省区市机械工程学会学术会议论文集[C];2003年
易红亮;马鸣图;李志刚;;[A];“技术创新与核心能力建设”重庆汽车工程学会2006年会论文集[C];2006年
苏运霖;;[A];广西计算机学会2007年年会论文集[C];2007年
王洪超;李亚安;齐彦生;;[A];2006’和谐开发中国西部声学学术交流会论文集[C];2006年
周建龙;刘景波;牛海军;张宴速;;[A];全国自动化新技术学术交流会会议论文集(一)[C];2005年
江标;宫云战;杨朝红;;[A];第五届中国测试学术会议论文集[C];2008年
陈玉玲;翁爱华;刘云鹤;;[A];中国地球物理·2009[C];2009年
中国重要报纸全文数据库
立本;[N];电子报;2007年
赵玉勇;[N];电脑报;2003年
顾鹏尧;[N];电脑报;2003年
耿德根;[N];电子报;2006年
立本;[N];电子报;2007年
吴秀生;[N];人民政协报;2003年
记者张亚德;[N];保定日报;2009年
耿德根;[N];电子报;2008年
W[N];电脑报;2004年
磁动力工作室
明浩;[N];电子报;2005年
中国博士学位论文全文数据库
陈俊清;[D];上海交通大学;2012年
余厉阳;[D];浙江大学;2005年
陈文;[D];华南理工大学;1994年
常颖;[D];黑龙江大学;2008年
马晓东;[D];国防科学技术大学;2009年
徐承志;[D];武汉大学;2010年
王泓;[D];西北工业大学;2002年
黄庆平;[D];清华大学;1988年
朱俊逸;[D];郑州大学;2006年
凌翔;[D];武汉大学;2013年
中国硕士学位论文全文数据库
刘钦;[D];大连理工大学;2011年
周丽丽;[D];苏州大学;2011年
邬桐;[D];复旦大学;2010年
孙海春;[D];山东科技大学;2010年
郭晶;[D];大连理工大学;2011年
应建健;[D];浙江工业大学;2007年
王知远;[D];大连理工大学;2009年
魏达;[D];吉林大学;2009年
宋艳秋;[D];湖北师范学院;2012年
李春辉;[D];西安科技大学;2009年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 知识超市公司
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号工具类服务
编辑部专用服务
作者专用服务
解析C语言中自增自减运算符
C语言中自增自减运算符的运算规则是比较灵活的,它在不同的表达式或不同的位置上的运算规则都有所区别.该文从3个方面及10个典型实例剖析了自增自减运算符的运算规律.
作者单位:
私立华联学院,广东,广州,510663
年,卷(期):
机标分类号:
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社C语言运算符优先级列表(超详细)
字体:[ ] 类型:转载 时间:
本篇文章是对C语言中运算符的优先级进行了详细的分析介绍,需要的朋友参考下
每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家,欢迎拍砖!
C语言运算符优先级
名称或含义
数组名[常量表达式]
(表达式)/函数名(形参表)
成员选择(对象)
对象.成员名
成员选择(指针)
对象指针-&成员名
负号运算符
单目运算符
按位取反运算符
自增运算符
++变量名/变量名++
自减运算符
--变量名/变量名--
取值运算符
取地址运算符
逻辑非运算符
强制类型转换
(数据类型)表达式
长度运算符
sizeof(表达式)
表达式/表达式
双目运算符
表达式*表达式
余数(取模)
整型表达式%整型表达式
表达式+表达式
双目运算符
表达式-表达式
变量&&表达式
双目运算符
变量&&表达式
表达式&表达式
双目运算符
表达式&=表达式
表达式&表达式
表达式&=表达式
表达式==表达式
双目运算符
表达式!= 表达式
表达式&表达式
双目运算符
表达式^表达式
双目运算符
表达式|表达式
双目运算符
表达式&&表达式
双目运算符
表达式||表达式
双目运算符
条件运算符
表达式2: 表达式3
三目运算符
赋值运算符
变量=表达式
变量/=表达式
变量*=表达式
取模后赋值
变量%=表达式
变量+=表达式
变量-=表达式
左移后赋值
变量&&=表达式
右移后赋值
变量&&=表达式
按位与后赋值
变量&=表达式
按位异或后赋值
变量^=表达式
按位或后赋值
变量|=表达式
逗号运算符
表达式,表达式,…
说明:同一优先级的运算符,运算次序由结合方向所决定。简单记就是:! & 算术运算符 & 关系运算符 & && & || & 赋值运算符
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 c语言运算符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信