解析C语言中自增自减运算符

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:quzg2008
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:C语言中自增自减运算符的运算规则是比较灵活的,它在不同的表达式或不同的位置上的运算规则都有所区别。该文从3个方面及10个典型实例剖析了自增自减运算符的运算规律。
  关键词:C语言;自增自减运算符;优先级;前缀自增(减);后缀自增(减)
  中图分类号:TP312文献标识码:A文章编号:1009-3044(2010)17-4671-03
  
  C语言是计算机专业重要的基础课程,由于C语言简洁、灵活、运算符丰富,功能强大,而深受广大计算机应用人员的喜爱,也正因为它的灵活多变,故不易掌握。C程序设计语言中有大量的运算符,其中的自增运算符 和自减运算符--是C语言中特有的两个运算符、自增、自减运算符在C程序中是十分常见的,也是全国计算机等级等各类考试中常见题目,尤其是自增自减表达式的结果,往往让初学者摸不着头脑,但是如果没有透彻掌握这两个运算符的含义及运算实质,使用时可能会使整个程序结果事与愿违。本文以win-tc为运行环境,浅析自增自减运算符在不同环境下的运行规律。
  1 自增 自减--运算符的运算规则
  在C语言程序设计中,自增运算符为“ ”及自减运算符“--”是非常常用的算术运算,也是比较特殊的两种运算符, 它们的作用分别是使变量的值增加1和减少1,结果均保存在原变量中,其功能相当于加、减表达式的简写形式,例如i 相当于表达式i=i 1,--i相当于i=i-1。它是一个单目运算符,只能作用于变量进行运算,而不能用于常量或表达式,该变量通常是整型或者是字符型。如a 或b--都是合法的,而3 或(a b) 都是不合法的。由于自增运算符是在表示在原来变量的基础上自加1,最后的结果还是保存在原来的变量中,假如是常量,常量的值不能改变,无法自加1,不符合逻辑要求;若是表达式,如(a b) ,假如a b=10,自增后的值11又不知保存到那个内存空间去,无变量空间可供存放,所以是非法的表达式。
  自增运算符“ ”与自减运算符“-”既可以写在变量名的前面,也可以写在变量名的后面,分别称为前缀自增(减)和后缀自增(减)。
  1) i(前缀自增) 变量i先自增1,然后再使用i的值
   --i(前缀自减) 变量i先自减1,然后再使用i的值
  2) i (后缀自增) 先使用变量i的值,然后i再自增1
   i--(后缀自减) 先使用变量i的值,然后i再自减1
  当自增表达式或自减表达式作为单一的语句出现时,两者没有区别。
  以下以自增表达式为例,自减表达式的原理类似,这里就不再累述。
  例如,以下两个例子代码是等价的。
  例1:
  main()
  {int x=5; x ; printf("%d",x);getch();}
  /* 结果输出x的值为6 */
  例2:
  main()
  {int x=5; x; printf("%d",x); getch();}
  /* 结果输出x的值为6 */
  但如果自增运算符或自减运算符出现在表达式中,则两者的运算结果会有所区别。例如:
  例3:
  main()
  {int x=5; y=x ; printf("%d,%d",x,y); getch(); }
  /* 先把x的值5赋给变量y,然后x再自增1,结果输出x的值为6,y的值为5 */
  例4:
  main()
  { int x=5; y= x; printf("%d,%d",x,y); getch(); }
  /* 先x的值自增1,变为6,然后把6赋给变量y, 结果输出x的值为6,y的值也为6 */
  由以上例子知道,当自增运算符和自减运算符出现在表达式中,就得特别注意他们所处的位置,是在变量之前还是在变量之后,其运算顺序有所不同,结果也不同。
  2 自增(自减)运算符与加减运算符间的混合运算规则
  自增(自减)运算符与加减运算符进行混合运算,在算术表达式中的情况比较常见的,但也是比较容易出问题的。例如:
  例5:
  main()
  { int x=5,y;
   y=-x ;
   printf("%d,%d",x,y);
   getch();
  }
  这个例子中y=-x 表达式,是将表达式理解为y=(-x) ,还是理解为y=-(x )呢?要解决这个问题,就得从运算符的优先级及结合方向来考虑,自增” ”、取反”-“运算符优先级都是第2级,结合方向都是从右向左,按照C语言的规定,相同优先级运算符的运算先后次序由结合方向来决定,由于两个运算符都是右结合性,所以表达式应该理解为y=-(x ),从而得出最后结果:x的值为6,y的值为-5。
  例6:
  main()
  { int x=5,y;
  y=x x x;
  printf("%d,%d",x,y);
  getch();
  }
  要得出x,y的值,首先要搞清 运算符的含义。由于C语言编译器在处理自增运算符在算术表达式中的运算规则是:从左至右尽可能多的将若干个字符组成一个有意义的运算符,如i j,等价于(i ) j,因此y=x x x表达式C编译器将其处理为y=(x ) (x ) x,而不是y=x ( x) ( x)。
  接下来是计算y=(x ) (x ) x表达式的值,那么,它们的值到底是多少呢? y=5 6 7=18 还是y=5 5 5=15呢?
  C语言在计算一个表达式时,如果表达式含有对于整型变量自增运算符,则首先执行所有的前缀自增操作,然后让变量参加算术运算,得到表达式的结果,最后再执行后缀增量操作,最终确定变量的值。因此y=(x ) (x ) x表达式的计算过程如下:
  1) 由于没有前缀自增量操作,所以先取x的值5计算表达式的值:y=5 5 5=15。
  2) 然后再执行后缀自增量运算,该表达式中有两个后缀自增量操作,则执行后x=7。
  由此可见,例6代码执行后x的值为7,y的值15。
  例7:
  main()
  { int x=5,y;
   y= x ( x) x ;
   printf("%d,%d",x,y);
   getch();
  }
  分析:依照例6的分析,y= x ( x) x 表达式C语言编译器将其处理为y=( x) ( x) (x ),整个表达式的计算过程如下:
  1) 首先执行前缀自增量操作,在表达式中有两个前缀自增变量,经过这两个前缀自增量后,x=7。
  2) 然后再取x的值7计算表达式的值:y=7 7 7=21。
  3) 最后再执行后缀自增量运算,该表达式中有一个后缀自增量操作,则执行后x=8。
  因此,例7代码执行后x=8,y=21。
  例8:
  main()
  { int x=5,y;
   y= x ( x) ( x);
   printf("%d,%d",x,y);
   getch();
  }
  分析:依照例6的分析,y= x ( x) ( x)表达式C语言编译器将其处理为y=( x) ( x) ( x),根据C语言在计算表达式的规则,整个表达式的计算过程如下:
  4) 首先执行前缀自增量操作,在表达式中有三个前缀自增变量,经过这三个前缀自增量后,x=8。
其他文献
进入21世纪,北京市水产业步入一个崭新的发展阶段,渔业进入了结构战略性调整的重要时期.根据全国渔业工作会议提出"努力构建健康的捕捞业、发达的养殖业、先进的加工业、活跃
该文从物理原因、操作失误、蓄意攻击、信息泄露和内部人员非法操作等方面分析了当前电子政务系统运行中的主要信息安全威胁,并从法制、管理、技术等方面提出了解决对策。
ARP协议作为TCP/IP协议簇中的底层基础协议至今依然发挥着重要的作用。但因为历史的原因,其安全机制十分薄弱。针对局域网络中普遍存在的ARP攻击,提出基于NDIS IMD驱动的ARP
随着经济的发展和社会的转型,高职教育特别是高职计算机专业的教育理念、目标、教学方式、评价等方面都面临着改革,而作为其中重要教学内容的网络知识模需要特别深入的研究。
目的分析探讨早期糖尿病肾病患者采用中西医结合治疗的临床疗效。方法以我院2015年12月—2017年12月收治的86例早期糖尿病肾病患者为研究对象,按照随机数字表法均分为观察组(4
按传统大地构造理论,内蒙古阿巴嘎旗必鲁甘干钼矿区大地构造位置位于天山内蒙地槽褶皱系,内蒙华力西晚期褶皱带中部,三级构造单元阿巴嘎旗复向斜中段,查干敖包倒转背斜的核部,区域
近年来,无论是现代职业教育体系规划还是国家教育改革发展规划,都明确提出要加快区域职业教育合作,提升职业教育办学质量。课程建设是高职院校提高教学质量、深化内涵建设的
以学习成果为导向的高职课堂教学模式立足高职教育实践性、应用性等特殊性,以学生为中心,在教学中注重理论与实践的密切结合,关注学生职业知识、职业技能、职业素养的培养,增
目的探讨延续性护理在老年髋部骨折患者中的应用效果及其对患者术后远期功能恢复的影响。方法选择东莞市沙田镇沙田医院2017年2月-2018年11月收治的80例髋部骨折老年患者纳入