打印

请教个C语言问题!

[复制链接]
2039|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
space005|  楼主 | 2008-6-27 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<1> 
#include <AT89X51.H> 
unsigned int TD3; 
void w_r() 

unsigned int em; 
em=TD3/1000;//em结果为230 
em=TD3/100-(TD3/1000)*10;//em结果为30 
em=TD3/10-(TD3/100)*10;//em结果为0 
em=TD3%10; //em结果为0 
while(1); 

void main() 

TD3=230; 
w_r(); 



<2> 
#include <AT89X51.H> 
unsigned int em; 
unsigned int TD3; 
void w_r() 

em=TD3/1000;//em结果为0 
em=TD3/100-(TD3/1000)*10;//em结果为2 
em=TD3/10-(TD3/100)*10;em结果为3 
em=TD3%10; //em结果为0 
while(1); 

void main() 

TD3=230; 
w_r(); 

上面两个程序的em运算结果为什么不一样啊?第一个程序的em结果是怎么得出的啊? 
我是用keil调试的!

相关帖子

沙发
dai_weis| | 2008-6-28 23:52 | 只看该作者

看看汇编代码

在运算上有什么不同

使用特权

评论回复
板凳
btiger2000| | 2008-6-29 10:09 | 只看该作者

都是优化惹的祸!

两个办法: 1、更改优化级别;
           2、将局部变量定义为static

使用特权

评论回复
地板
ningling| | 2008-6-29 12:01 | 只看该作者

定义的变量不同

定义的变量的类型不同,一个是全局变量,一个是局部变量

使用特权

评论回复
5
space005|  楼主 | 2008-6-29 16:46 | 只看该作者

一位网友的分析

以下是一位网友的分析:
“两个em,其实最终都与输出无关,所以这两个变量的值是否正确都无关紧要,所以编译器就做了优化,这些变量有可能被别的变量占据了空间。第一个em是局部变量,更容易被优化掉。如果要让编译器不优化掉某个局部变量,这个变量必须能影响到一些特殊寄存器的值,或者影响到一些标记为 volatile的变量,这样编译器才认为这个变量参与了输出。”

难道非要把这个变量定义为全局变量么?以上问题是我在调试一个程序时发现的,列出的程序是原程序中的一个片段,本来定义为局部变量,是想节省内存空间的!

使用特权

评论回复
6
snailxixi| | 2008-6-30 01:26 | 只看该作者

~

以前遇到过,单步一下就看到了

是优化的

使用特权

评论回复
7
space005|  楼主 | 2008-7-1 17:33 | 只看该作者

的确是优化的,将优化级别改为7就行了!

使用特权

评论回复
8
HWM| | 2008-7-2 08:15 | 只看该作者

一个有意义的功能块至少有一个变量输出,若无整个都可以

除非仅用它耗费时间。

使用特权

评论回复
9
robotics30| | 2008-7-2 15:22 | 只看该作者

看看

使用特权

评论回复
10
51yao| | 2008-7-2 16:15 | 只看该作者

顶,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

16

帖子

0

粉丝