黑马程序员技术交流社区

标题: 以下代码正确的是? (多选) [打印本页]

作者: 黄佳    时间: 2012-10-15 12:52
标题: 以下代码正确的是? (多选)
本帖最后由 黄佳 于 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;   

请注明原因
作者: 刘 佳    时间: 2012-10-15 12:55
选c

类型提升问题

c是只做一次运算  其他都是运算后再赋值
作者: 张忠豹    时间: 2012-10-15 13:47
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
作者: 黄佳    时间: 2012-10-15 14:24
刘 佳 发表于 2012-10-15 12:55
选c

类型提升问题

答案是  ACD   自己敲了一遍代码  就知道了   ACD 都能编译通过 结果为2   B编译报错:有可能损失精度
作者: 刘 佳    时间: 2012-10-15 14:40
黄佳 发表于 2012-10-15 14:24
答案是  ACD   自己敲了一遍代码  就知道了   ACD 都能编译通过 结果为2   B编译报错:有可能损失精度 ...

仔细看了一下,d确实是对的,++放后面就错了。我不理解A为什么对
作者: 李建强    时间: 2012-10-15 15:56
刘 佳 发表于 2012-10-15 14:40
仔细看了一下,d确实是对的,++放后面就错了。我不理解A为什么对

++放后面也可以的。


A正确的原因。
byte b = 1 + 1;  
看起来像是2个int相加,结果应该强制转换的,
但事实上,
在编译的时候,编译器会去检查赋值,
如果不会造成精度损失则进行窄类型转换,
造成精度损失或者是变量不能判断时,不能通过编译。
可以试试赋值128或者赋值变量,都不能通过编译。

作者: 陈军    时间: 2012-10-15 16:30
本帖最后由 陈军 于 2012-10-15 16:36 编辑

ACD都能正确运行,
A。右边都是同类型,虚拟机会先尝试窄转换。当检测右边的值有没有超过byte范围, 没超过不报错。超过就报错
B。java是强类型语言。右边会有自动转换类型提升,再赋值给byte型,不允许(它认为这很可能会损失精度)
C  有自动转换动作,
D,b=++b;跟++b;一样的,但是编译器允许。b=b++;也可以。只不过吃饱了撑着。。。
作者: 王梁星    时间: 2012-10-15 16:30
本帖最后由 王梁星 于 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 16:33
刘 佳 发表于 2012-10-15 14:40
仔细看了一下,d确实是对的,++放后面就错了。我不理解A为什么对

++后置可以。我觉得可以把=++看成一个运算符,隐含系统自动强转
作者: 刘 佳    时间: 2012-10-15 16:37
李建强 发表于 2012-10-15 15:56
++放后面也可以的。

要学的太多了,真不知道这些细节的东西。以大局为重,不钻牛角尖了
作者: 李建强    时间: 2012-10-15 17:12
刘 佳 发表于 2012-10-15 16:37
要学的太多了,真不知道这些细节的东西。以大局为重,不钻牛角尖了

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

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

你这样说,我更惭愧了= =
作者: 李建强    时间: 2012-10-15 17:27
本帖最后由 李建强 于 2012-10-15 17:29 编辑

差点又没忍住答题==!

作者: 李建强    时间: 2012-10-15 17:29
刘 佳 发表于 2012-10-15 17:16
你这样说,我更惭愧了= =

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







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2