目录
基本概念
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博客