对C语言中自增自减运算的剖析.pptx_第1页
对C语言中自增自减运算的剖析.pptx_第2页
对C语言中自增自减运算的剖析.pptx_第3页
对C语言中自增自减运算的剖析.pptx_第4页
对C语言中自增自减运算的剖析.pptx_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,对C语言中自增自减运算的剖析,导读,运算符多、操作灵活是C语言的一大特色。在诸多的运算符中,最容易出错的便是自增自减运算符。 C语盲允许在一个表达式中使用两个以上的赋值类运算。这种灵活性使程序简洁,但同时也会带来副作用。 本文以VC6.0编译系统为标准,详解C语言中的自增自减运算符,以期达到正确的运用。,自增自减运算符的基本概念,自增运算符是+,其作用是使变量增加1。 自减运算符是-,其作用是使变量减小1。 有两种形式前置式与后置式: 前置式:+i,先增加i再使用变量i。 后置式:i+,先使用变量i再增加i。,注意事项,1.自增自减运算符只用于变量,不能用于常量或表达式。 原因:自增、自减运算符具有对运算量重新赋值的功能,而常量、表达式无存储单元,当然不能做自增、自减运算。 举例:10+,(a+b)+都是都是不合法的。 i+j+ 是合法的,+i+j是不合法的。 因为C语言规定,从左到右尽可能多的将字符组合成运算符,所以i+j+也就是(i+)+(j+),是合法的。而+i+j也就是+(i+)+j,第一个+作用到表达式(i+)上,因此是不合法的。,2.自增自减运算符的结合方向是从右向左(右结合性) 运算符的结合性指同一优先级的运算符在表达式中操作的组织方向, 即当一个运算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, C 语言规定了各种运算符的结合方向( 结合性) 。大多数运算符结合方向是“自左至右”, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a- b 的运算, 再执行加c 的运算。除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符。,3.自增自减运算符的优先级是2,仅次于括号等优先级为1的算符,高于乘除等优先级为3的算符。优先级为2的一系列运算符都是右结合性的。 举例: 例如当i=6 时, 求- i+的值和i 的值。 由于“- ”(负号) “+”为同一个优先级,这个优先级是右结合性的,故应理解为- (i+), 又因是后置加, 所以先有-i+的值为-6, 然后i自增为7。 又如+i*i+,由于+优先级高于*,故等效于( +i)*(i+)。,同一表达式中多次出现自增自减的问题,问题:请写出输出结果,int i=3; int j=3; int a = i+ + i+; int b = +j + +j; printf(“%d, %dn“, a, b);,例1解析,这个问题比较混乱: i+ + i+: 先自增一次,相加,再自增,得到4+4=8 先相加,然后自增两次,得到3+3=6 +j + +j: 先自增一次作为被加数,再自增一次作为加数,得到4+5=9 先自增两次,再相加,得到5+5=10,例1解析,事实上,不同编译系统有着不同的规定,可能得到不同的答案。此处仅限于VC6的标准。 在VC6中输入上述代码,可得到答案是:6,10 这就需要我们对自增自减运算符的具体运算过程进行详细分析,例1解析,i+的应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a336 +j是先自增然后再参加其它运算,所以b6612 但是此时3个以上运算符的理解仍不明确,我们再看个例子。,例2,int i=3; int j=4; int a = i+ + i+ + i+; int b = +j + +j + +j; printf(“%d, %dn“, a, b); 这个程序的结果又是什么呢?,例2解析,事实上,电脑在进行运算时,是运用栈的数据结构进行运算。简言之,就是“从左到右,能算就算”,而在运算时引用的变量是当前内存里的值。 例1中+j + +j应该这样理解:先运行+j,这时j=4,栈里存变量名“j”,再运行+j,这时j=5,栈里已经有两个j了,而且此时已经可以运算,故结果是5+5=10。 i+ + i+ 应该理解为2个i相加得6,然后i自增两次。,例2解析,仿照上述过程计算+j + +j + +j: 首先,j自增一次得到5,栈里存变量名j。然后j再自增一次得6,这时可以计算j+j,得12。然后j再自增一次得7,再计算加法,得12+7=19 对于i+ + i+ + i+,按照上述理解,应该是3+3+3=9。 事实上,在VC6中输入上述代码,就是得到9和19。这说明我们的理解是正确的。,例2解析,+j + +j + +j的具体过程可以参见汇编代码(不懂的可略过): mov ecx,dword ptr ebp-8 add ecx,1 mov dword ptr ebp-8,ecx / 第一个+j mov edx,dword ptr ebp-8 add edx,1 mov dword ptr ebp-8,edx / 第二个+j mov eax,dword ptr ebp-8 add eax,dword ptr ebp-8 / +j + +j mov ecx,dword ptr ebp-8 add ecx,1 mov dword ptr ebp-8,ecx / 第三个+j add eax,dword ptr ebp-8 / +j + +j + +j mov dword ptr ebp-10h,eax / 赋值给b,例2解析,a = i+ + i+ + i+的汇编代码: mov eax,dword ptr ebp-4 add eax,dword ptr ebp-4 / i+i add eax,dword ptr ebp-4 / i+i+i mov dword ptr ebp-0Ch,eax / 赋值给a mov ecx,dword ptr ebp-4 add ecx,1 mov dword ptr ebp-4,ecx / 第一次i+ mov edx,dword ptr ebp-4 add edx,1 mov dword ptr ebp-4,edx / 第二次i+ mov eax,dword ptr ebp-4 add eax,1 mov dword ptr ebp-4,eax / 第三次i+,例3,int i=3,a; a=(i+)+(+i)+(i+); printf(“%dn”,a); 请写出运行结果,例3解析,此处是前置与后置的混合使用,但只要记住后置式最后再自增,以及“从左到用,能算就算”的运算法则,就能得出正确答案。 当运行到第二项时,i自增得到4,然后运行两次加法,所以原题答案应该是: 4+4+4=12。,总结,总结,语言简洁,代码占内存小,程序执行效率高,是C语言的优点。正确掌握自增自减运算符的使用方法,在程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论