免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 890 | 回复: 0
打印 上一主题 下一主题

半斤&八两 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-05 18:27 |只看该作者 |倒序浏览
半斤&八两
又是表达式结果类型的问题,为什么不制定一个简单规格的规则呢?真是晕不到你,死不休啊!
一知半解是最危险的事情。
给出一个对变量x和i的声明后 1.x += i; 2. x = x + i; 那一个是合法的? 我真想抽它,不管是
以前学c++,还是现在学java。老师都是说:1是2的简写形式,它们两实质上是一样的。今天居然遇到
了这种问题!读到这儿我对我以前学的知识产生了严重的怀疑,我不敢去推测答案,因为我不知道前面会
出现什么?
原理:
Java语言规范中讲到,复合赋值 E1 op= E2等价于简单赋值E1 = (T)((E1)op(E2)),其中T是E1的类型,除非E1只被计算一次。
换句话说,复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,
那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原始类型转换。
请注意复合赋值可能背着我们做些见不得人的勾当,它会narrowing conversion 我们的数据却不打招呼,
它是个危险的家伙。例如:
short x = 0;
int i = 123456;
x += i; // 包含了一个隐藏的转型!
x = x + i;//编译报错,可能损失精度
经验:
不要把复合赋值用在左边的操作数比右边操作数窄的场合!
对语言设计者来说,也许让复合赋值操作符产生一个不可见的转型本身就是一个错误;
对于在复合赋值中的变量类型比计算结果窄的情况,也许应该让其非法才对(强烈支持)。
基于前面的谜题,你可能会想:符合赋值操作符比简单赋值操作符的限制要少一些。在一般情况下,
这是对的,但是有这么一个领域(天啦,又来了),在其中简单赋值操作符会显得更宽松一些。
1.复合赋值操作符要求两个操作数都是原始类型的,例如int,或包装了的原始类型,例如Integer,但是有一个例外:
如果在+=操作符左侧的操作数是String类型的,那么它允右侧的操作数是任意类型,在这种情况下,该操作符执行的是
字符串连接操作.
2.简单赋值操作符(=)允许其左侧的是对象引用类型,这就显得要宽松许多了:你可以使用它们来表示任何你想要表示的内容,
只要表达式的右侧与左侧的变量是赋值兼容的即可。
又是那些让人看了就想呕吐的规则,说白了就是要想用 += 操作符来执行字符串连接操作,你就必须将左侧的变量声明为String类型。
通过使用直接赋值操作符,字符串连接的结果可以存放到一个Object类型的变量中。
事例:
Object x = "Buy ";
String i = "Effective Java!";
简单赋值是合法的,因为 x + i 是String类型的,而String类型又是与Object赋值兼容的:
x = x + i;
复合赋值是非法的,因为左侧是一个Object引用类型,而右侧是一个String类型:
x += i;
  

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/28187/showart_243215.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP