资源描述:
《对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,1movdwordptr[
8、ebp-8],ecx//第一个++jmovedx,dwordptr[ebp-8]addedx,1movdwordptr[ebp-8],edx//第二个++jmoveax,dwordptr[ebp-8]addeax,dwordptr[ebp-8]//++j+++j movecx,