A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄佳 中级黑马   /  2012-10-15 12:52  /  1977 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄佳 于 2012-10-15 14:26 编辑

A,  byte b = 1 + 1;     
B,  byte b = 1;        b = b + 1;   
C,  byte b = 1;        b += 1;   
D,  byte b = 1;        b = ++b;   

请注明原因

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
选c

类型提升问题

c是只做一次运算  其他都是运算后再赋值

点评

答案是 ACD 自己敲了一遍代码 就知道了 ACD 都能编译通过 结果为2 B编译报错:有可能损失精度  发表于 2012-10-15 14:25

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
A,  byte b = 1 + 1;     应该强制类型转换
B,  byte b = 1;        b = b + 1;   同A
C,  byte b = 1;        b += 1;    +=相当于一个运算符,在运算的过程中自动进行强制类型转换
D,  byte b = 1;        b = ++b;   D也是对的,
答案为CD

点评

答案是 ACD 自己敲了一遍代码 就知道了 ACD 都能编译通过 结果为2 B编译报错:有可能损失精度  发表于 2012-10-15 14:25
回复 使用道具 举报
刘 佳 发表于 2012-10-15 12:55
选c

类型提升问题

答案是  ACD   自己敲了一遍代码  就知道了   ACD 都能编译通过 结果为2   B编译报错:有可能损失精度
回复 使用道具 举报
黄佳 发表于 2012-10-15 14:24
答案是  ACD   自己敲了一遍代码  就知道了   ACD 都能编译通过 结果为2   B编译报错:有可能损失精度 ...

仔细看了一下,d确实是对的,++放后面就错了。我不理解A为什么对
回复 使用道具 举报
刘 佳 发表于 2012-10-15 14:40
仔细看了一下,d确实是对的,++放后面就错了。我不理解A为什么对

++放后面也可以的。


A正确的原因。
byte b = 1 + 1;  
看起来像是2个int相加,结果应该强制转换的,
但事实上,
在编译的时候,编译器会去检查赋值,
如果不会造成精度损失则进行窄类型转换,
造成精度损失或者是变量不能判断时,不能通过编译。
可以试试赋值128或者赋值变量,都不能通过编译。
回复 使用道具 举报
陈军 中级黑马 2012-10-15 16:30:59
7#
本帖最后由 陈军 于 2012-10-15 16:36 编辑

ACD都能正确运行,
A。右边都是同类型,虚拟机会先尝试窄转换。当检测右边的值有没有超过byte范围, 没超过不报错。超过就报错
B。java是强类型语言。右边会有自动转换类型提升,再赋值给byte型,不允许(它认为这很可能会损失精度)
C  有自动转换动作,
D,b=++b;跟++b;一样的,但是编译器允许。b=b++;也可以。只不过吃饱了撑着。。。
回复 使用道具 举报
本帖最后由 王梁星 于 2012-10-15 16:32 编辑
  1. class ByteInt{
  2.   public static void main(String[] args){
  3.     a();
  4.     b();
  5.     c();
  6.     d();
  7.   }public static void a(){
  8.     byte b=1+1;//这就好比b=1,不可以认为是b=1+0吗?也隐含由系统自动完成的强转过程
  9.     System.out.println(b);
  10.   }public static void b(){
  11.      // byte b=1;
  12.      // b=b+1;//编译失败,可能损失精度
  13.      // System.out.println(b);
  14.   }public static void c(){
  15.     byte b=1;
  16.     b+=1;//+=运算符是一个运算过程,隐含由系统自动完成的强转过程
  17.     System.out.println(b);
  18.   }public static void d(){
  19.     byte b=1;
  20.     b=++b;//等价于b=b+1;b=b。
  21.           //=++运算符是一个运算过程,隐含由系统自动完成的强转过程
  22.     System.out.println(b);
  23.   }
  24. }


  25. 除b外都对,d的++后置也对
复制代码
回复 使用道具 举报
刘 佳 发表于 2012-10-15 14:40
仔细看了一下,d确实是对的,++放后面就错了。我不理解A为什么对

++后置可以。我觉得可以把=++看成一个运算符,隐含系统自动强转

点评

大哥 你太有思想了  发表于 2012-10-15 20:35
回复 使用道具 举报
李建强 发表于 2012-10-15 15:56
++放后面也可以的。

要学的太多了,真不知道这些细节的东西。以大局为重,不钻牛角尖了
回复 使用道具 举报
刘 佳 发表于 2012-10-15 16:37
要学的太多了,真不知道这些细节的东西。以大局为重,不钻牛角尖了

程序员的境界
x 语言入门 —>
x 语言应用实践 —>
x 语言高阶编程 —>
x 语言的科学与艺术 —>
编程之美 —> 编程之道 —>
编程之禅 —>
颈椎病康复指南

你说的对,以大局为重
还在语言入门阶段,羞愧...
以后还是等我进入禅境再普渡解惑吧。
回复 使用道具 举报
李建强 发表于 2012-10-15 17:12
程序员的境界
x 语言入门 —>
x 语言应用实践 —>

你这样说,我更惭愧了= =

点评

这不是扣字眼 懂点java底层的运算过程 还是对编程思想有很大好处的  发表于 2012-10-15 20:37
太抠那些字眼没多大意义,实际项目没有人会被允许写出这种脑残的代码的,呵呵,只不过考试的时候会考到。  发表于 2012-10-15 17:34
回复 使用道具 举报
本帖最后由 李建强 于 2012-10-15 17:29 编辑

差点又没忍住答题==!

点评

此处不答胜已答  发表于 2012-10-15 20:38
回复 使用道具 举报
刘 佳 发表于 2012-10-15 17:16
你这样说,我更惭愧了= =

差点又没忍住答题==!
你先答够25分再归隐吧


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马