当前位置:编程学习 > C/C++ >>

C语言小程序的调试结果

程序1
#include <stdio.h>
void main()
{
int i=100;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
}
程序2
#include <stdio.h>
void main()
{
int i=100;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i);
}
程序3
#include <stdio.h>
void main()
{
int i=100;
printf("%d\n%d\n%d\n%d\n",++i,--i,i,i--);
}
4个程序调试出来的结果都是
100
99
100
100
可是我从左往右还是从右往左算都算不出来这个结果
谁能说下,这结果是怎么出来的
补充:我有的是VC
		
追问:按你的解释,结果是100.99.100.100
答案:
给你讲一下程序1的输出结果怎么来的,其他的可以自己分析。
int i=100;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
1 2 3 4
VC++的printf语句是从右向左扫描参数的。在上面的输出语句中
(1)编译器首先扫描第四个参数i--,i本来的值是100,所以第四个%d输出100,--操作不会马上被执行,要等printf语句执行完后才执行,此时i的值仍是100。
(2)然后扫描第三个参数i++,同样输出100,,++也操作不会马上被执行,要等printf语句执行完后才执行,i的值仍是100
(3)接着扫描第二个参数--i,--i被马上执行,i的值变成99,然后被输出。
(4)扫描第一个参数++i,++i被马上执行,i的值变成100,然后输出。
(5)printf语句执行结束,i执行刚才没有被马上执行的--操作,i的值变为99
(6)--操作执行结束,i执行刚才没有被马上执行的++操作,i的值又变回100。
所以如果你在程序1的printf语句下面再加一句printf语句输出i的值,会发现i的值仍然是100;而如果你在程序2的printf语句下面加一句printf语句输出i的值,会发现i的值变成了101;如果你在程序3的printf语句下面加一句printf语句输出i的值,会发现i的值变成了99!说得够明白了吧,自己去试一下?
这个很简单,对于这种问题,编译器是这样处理的。
比如说i++,i--;这样句子,首先使用后变化;但是i是要在当前表达式(分号前全部执行完)完成后才会++,--的,而在当前表达式里面,他都会不变的。
而对于++i,--i;首先是先自加再使用,所以i会先改变,再输出,而不必等到表达式结束。
哪有4个程序?
不可能是这个结果
#include <stdio.h> 
void main()
{
int i=100;
printf("%d\n%d\n%d\n%d\n",i++,--i,i,i--);
}
不知道你用的什么编译环境,我在我的编译环境下运行了这三个程序,结果不像你说的都是一样。还有,我也还不是很明白这个,我刚才还在想这个问题。
第一个程序结果就不对啊
#include <stdio.h> 
void main()
{
int i=100;

printf("%d\n",++i);

printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
//printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
}
要是这样改了,输出的结果就和我想的是一样!
printf函数先把参数压栈,然后自加,出栈输出第一个,把参数i压栈,然后自加,出栈输出i,等于没加.也就是++i和--i,一个有效一个没效的答案了。

上一个:用C语言完成 ATM转账 功能
下一个:寻求一C语言画图程序~

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,