自学内容网 自学内容网

关于自增和自减的一些细节问题

目录

基本概念

1.运算

2.输出


基本概念

在这里简单回顾一下自增和自减:顾名思义,自就是同一变量的值发生变化,自增就是该变量值加1,自减就是该变量值减1。

自增和自减又可以根据运算符的位置不同分为前缀式和后缀式。前缀就是先自增或自减然后带入表达式中;后缀就是先带入表达式中,然后再自增或自减。

不论是前缀还是后缀,变量最终值都是一样的,但是它们参与的表达式会产生不同的结果。

对于自增:++x(前缀),x++(后缀)

对于自减:--x(前缀),x--(后缀)

1.运算

因不同编译器之间有歧义,博主使用的是VS。

如图:下图中的y的值为15,z的值为18。那么它们的结果是从何而来的?

首先对y进行说明,表达式里面有两个前缀式和一个后缀式。除了理解前缀和后缀的规则外,还要明确一点:它们是在一个表达式里,也就是属于同一条执行语句。既然是一条语句,那就应该将里面的步骤都执行完再进行运算。

式中有两个前缀式,所以x会先自增两次,此时x的值是5。而后缀式是先将x当前的值带入表达式参与运算,再对x进行自增。所以实际上y的表达式是5+5+5=15。  里面的步骤就是前缀带来的两次自增,导致参与表达式的x的值变为5,最后运算就是3个5相加。

同样地,对于z来说,x先自减一次,又自增一次,所以x的值不变,而在执行完y的语句之后,x的值已经变为6。所以对于z就是6+6+6=18。执行完运算后,x还会因为表达式中的后缀式进行一次递减,所以最终x的值就为5。

为了验证这一说法正确,我们可以改动表达式,比如将y中的x++改为++x,那么现在y的值应该为18。(3个前缀表达式,所以x先自增3变为6,再带入表达式为6+6+6=18)。

再次强调,不同的编译器之间有歧义,算出来的结果可能不同,博主讨论的仅仅只是VS得出的结论。

2.输出

再看一道输出的题:两种输出,得出的结果却不一样。图一是1 2 2,图二是1 1 1。

图一
图二

其实原因和上面的运算题有点类似,图一是三条执行语句,自上而下按顺序执行就得到了1 2 2。

但是图二是一条执行语句,我们还要明确一点,就是printf语句是自右向左执行,输出的时候是自左向右输出。对图二来说,就是先调用x--,此时x的值为1,然后x自减变为0;再调用++x,x先自增变为1,此时x的值为1;最后再调用x,此时x的值为1。 所以最后输出的值就为1。

这里可以再参考一下其他博主的文章加深对这里的理解。C语言中printf中自增自减问题_自增自减在printf-CSDN博客


原文地址:https://blog.csdn.net/ylxb2234/article/details/135458934

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!