编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛  
 
全能 ASP / PHP / ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
发新话题
打印

简单的问题包含了复杂的东西(请大家指教)

简单的问题包含了复杂的东西(请大家指教)

float x=1.0f; x=x+1.0;//错误 这里的错误我能理解:java里float类型的变量或者数值从内存读出送给加法器进行运算前先要将变量的值转换成double类型,这样x+1.0运算好后的值为double,再要赋给float类型的x可能会丢失精确度,java不允许这样.

float x=1.0f; x+=1.0;//正确,为什么?

x+=1.0;这句话基本上所有书上说等价于:x=x+1.0; 真的完全等价吗?我觉得不是,至少它在机器硬件里运算时用的器件或者说运算时的步骤会不一样.请问谁能说说这2句语句有什么区别或者在机器里到底如何运行的吗?

TOP

你大致可以理解为x+=1.0隐含了一个强制类型转换吧。对于你的例子具体来说就是x=(float)(x+1.0);
不知道这么理解对不对,不过我测试过,x+=1.0后x为float类型,当然你也可以理解为x+=1.0时编译器并没有把它转换为double。。。这种问题个人认为知道就好了过分深究没有意义
相信勤能补拙! 喜欢用好用的就永远学不到有用的。

TOP

tempnetbar:感谢你对我的几个问题的指点.

关于这个问题,我已经在很多地方问过很多人,包括在csdn上,现在还是觉得你把它看成
x=(float)(x+1.0);最合适.
象:byte x=1;x=x+1;//错误
而byte x=1;++x;//正确
也可以这样理解x=(byte)(x+1);

不过至于你说的"x+=1.0后x为float类型",我觉得那是肯定的.因为运算符的操作数类型不一致时要进行类型指的是值或者说变量的值,而不是变量,变量一旦声明好类型就应该不会再变了.

还有你说的"x+=1.0时编译器并没有把它转换为double",我觉得这样说是错误的.因为byte,short,char类型的值或者变量再参加运算前先必须转换成int型,哪怕是2个byte型的参加运算;
float类型也是,一定要先转换成double型.所以根据这个,使你前面的那种说法更加可信度(虽然也不一定正确)

tempnetbar,你说过分深究这样的问题没有意义,不知道为什么,我看到这里搞不明白好象就不想往下看,好在现在我觉得你的这种说法我觉得可以接受,能解释这个问题了.看来我的学习方法有问题.

TOP

嗯……学习的话有时候就是要糊涂一点,当然该清楚地时候也要清楚。这个要自己去把握了。呵呵
还有关于你提到的那点,我的意思是x+1.0是float呵呵

[此贴子已经被作者于2005-3-2 13:14:34编辑过]


相信勤能补拙! 喜欢用好用的就永远学不到有用的。

TOP

发新话题