文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>半斤&八两

半斤&八两

时间:2007-02-05  来源:灰色骆驼

半斤&八两
又是表达式结果类型的问题,为什么不制定一个简单规格的规则呢?真是晕不到你,死不休啊!
一知半解是最危险的事情。
给出一个对变量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;
  

相关阅读 更多 +
排行榜 更多 +
开心动动脑安卓版 v1.0 手机版

开心动动脑安卓版 v1.0 手机版

休闲益智 下载
不良人破局手游下载

不良人破局手游下载

角色扮演 下载
云海之下手游下载

云海之下手游下载

角色扮演 下载