对c语言中自增自减运算的剖析x

对c语言中自增自减运算的剖析x

ID:40188388

大小:216.29 KB

页数:23页

时间:2019-07-25

对c语言中自增自减运算的剖析x_第1页
对c语言中自增自减运算的剖析x_第2页
对c语言中自增自减运算的剖析x_第3页
对c语言中自增自减运算的剖析x_第4页
对c语言中自增自减运算的剖析x_第5页
资源描述:

《对c语言中自增自减运算的剖析x》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、对C语言中自增自减运算的剖析导读运算符多、操作灵活是C语言的一大特色。在诸多的运算符中,最容易出错的便是自增自减运算符。C语盲允许在一个表达式中使用两个以上的赋值类运算。这种灵活性使程序简洁,但同时也会带来副作用。本文以VC6.0编译系统为标准,详解C语言中的自增自减运算符,以期达到正确的运用。自增自减运算符的基本概念自增运算符是++,其作用是使变量增加1。自减运算符是--,其作用是使变量减小1。有两种形式——前置式与后置式:前置式:++i,先增加i再使用变量i。后置式:i++,先使用变量i再增加i。注意事项1.自增自减运算

2、符只用于变量,不能用于常量或表达式。原因:自增、自减运算符具有对运算量重新赋值的功能,而常量、表达式无存储单元,当然不能做自增、自减运算。举例:10++,(a+b)++都是都是不合法的。i+++j++是合法的,++i+++j是不合法的。因为C语言规定,从左到右尽可能多的将字符组合成运算符,所以i+++j++也就是(i++)+(j++),是合法的。而++i+++j也就是++(i++)+j,第一个++作用到表达式(i++)上,因此是不合法的。2.自增自减运算符的结合方向是从右向左(右结合性)运算符的结合性指同一优先级的运算符在表

3、达式中操作的组织方向,即当一个运算对象两侧运算符的优先级别相同时,运算对象与运算符的结合顺序,C语言规定了各种运算符的结合方向(结合性)。大多数运算符结合方向是“自左至右”,例如a-b+c,b两侧有-和+两种运算符的优先级相同,按先左后右结合方向,b先与减号结合,执行a-b的运算,再执行加c的运算。除了自左至右的结合性外,C语言有三类运算符参与运算的结合方向是从右至左。即:单目运算符,条件运算符,以及赋值运算符。3.自增自减运算符的优先级是2,仅次于括号等优先级为1的算符,高于乘除等优先级为3的算符。优先级为2的一系列运算符

4、都是右结合性的。举例:例如当i=6时,求-i++的值和i的值。由于“-”(负号)“++”为同一个优先级,这个优先级是右结合性的,故应理解为-(i++),又因是后置加,所以先有-i++的值为-6,然后i自增为7。又如++i*i++,由于++优先级高于*,故等效于(++i)*(i++)。同一表达式中多次出现自增自减的问题问题:请写出输出结果inti=3;  intj=3;inta=i+++i++;  intb=++j+++j;printf("%d,%d",a,b);例1解析这个问题比较混乱:i+++i++:先自增一次,相加,

5、再自增,得到4+4=8先相加,然后自增两次,得到3+3=6++j+++j:先自增一次作为被加数,再自增一次作为加数,得到4+5=9先自增两次,再相加,得到5+5=10例1解析事实上,不同编译系统有着不同的规定,可能得到不同的答案。此处仅限于VC6的标准。在VC6中输入上述代码,可得到答案是:6,10这就需要我们对自增自减运算符的具体运算过程进行详细分析例1解析i++的应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a=3+3=6++j是先自增然后再参加其它运算,所以b=6+6=12但是此时3个以上运算符的理解仍不

6、明确,我们再看个例子。例2inti=3;  intj=4;  inta=i+++i+++i++;  intb=++j+++j+++j;  printf("%d,%d",a,b);这个程序的结果又是什么呢?例2解析事实上,电脑在进行运算时,是运用栈的数据结构进行运算。简言之,就是“从左到右,能算就算”,而在运算时引用的变量是当前内存里的值。例1中++j+++j应该这样理解:先运行++j,这时j=4,栈里存变量名“j”,再运行++j,这时j=5,栈里已经有两个j了,而且此时已经可以运算,故结果是5+5=10。i+++i++应

7、该理解为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的具体过程可以参见汇编代码(不懂的可略过):movecx,dwordptr[ebp-8] addecx,1 movdwordptr[

8、ebp-8],ecx//第一个++j movedx,dwordptr[ebp-8] addedx,1 movdwordptr[ebp-8],edx//第二个++j moveax,dwordptr[ebp-8] addeax,dwordptr[ebp-8]//++j+++j  movecx,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。