码迷,mamicode.com
首页 > 其他好文 > 详细

i++,++i输出问题

时间:2018-03-29 17:26:32      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:解释   include   输出   font   print   pre   出现   简单   color   

摘取

C语言,这组语句求解释(很简单的语句,但是想不通)

#include
main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}

 


输出结果是:8 7 8 8 -8 -8 ,请高手能说明下为什么是这个结果

 

首先给说一句,像这样的题没有必要钻的太深,主要是编译器不同,运算结果不同,如果一个代码里出现你这样的语句,那么它的移植性就非常糟糕,简单的说就是垃圾代码!

那为什么书本要出这样的题呢?他的目的主要是让学生了解printf函数处理参数的原理,所以楼主千万不要走错方向,拿题做题而不懂原理.
ok,现在谈谈二楼的回答,他虽然回答出了原因,但很遗憾是错的,稍微有点递归思想的话,就知道“...先入栈,最先被运算...”这是错的!三楼虽然回答了运算方向,但没有回答原因.所以,本人在此做一下全面的补充.
要回答这个问题,楼主首先要知道什么是栈区,栈所起的作用,以及栈的特点
通常所说的栈区指的是系统内的一块内存区(即栈内存)
先举个例子
比如现在有5个玻璃球分别编号为1,2,3,4,5和一个试管,我们按照编号顺序依次将小球放进试管,然后再一次将小球去出试管,这时你会发现我们放进去的顺序是1,2,3,4,5,而取出的顺序是5,4,3,2,1,顺序相反
5个小球相当于代表5个参数,而试管相当于栈内存用来存放这些参数,所以,出栈的过程是逆序的,这就是栈的特点”先进后出“,递归实现也就是这个原理,只不过参数变成了函数而已.
所以,栈区的作用是用来存放数据的,而不是处理数据,这也就是二楼说错的原因,那他到底什么时候处理数据的呢?是在数据出栈后,再交给CPU进行处理.
好了,现在来说说你的题,
你编译器的特点只运算前置,不用计算后置.
首先六个参数自左向右依次入栈,接着依次出栈(这时候才会对数据进行处理)
第一个出栈的是-i--,由于后置,最终值为-8
接着出栈-i++,同理,值为-8
接着i--,值为8
接着i++,值为8
接着--i,由于前置,所以最终结果为7
接着++i,由于前置,所以结果为8
而二楼为什么跟你的运算不一样呢?
原因是他的编译器输出值之后,还会计算后置,而这个计算过后置的i值会成为下一次计算i表达式的初始值,不妨自己试试.

 

i++,++i输出问题

标签:解释   include   输出   font   print   pre   出现   简单   color   

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/8670909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!