作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/04/29 02:52:58
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表达式的初始值,楼主不妨自己试试.