public static void main(String[] args) { short i; i = i+1; //报错 首先,i 是short 型的, 1 是int型的 i+1的结果不回自动转换成short 所以报错。 i+= 1; //正确 这个和上面表达式是一个意思,唯一不同的是 它会把结果 隐式转换成需要的数据类型。。 要把程序写的让别人看的很明白,就不提倡这种表达方式。 同意 不过想请教二楼的,如果不初始化i,i+=1是否依然正确??
public class add { public static void main(String[] args) { short i;i=(short)(i+1); i+= 1; }}//编译通不过,variable i might not have been initialized public class add { public static void main(String[] args) { short i=0;i=(short)(i+1); i+= 1; }}//Process completed.public class add { public static void main(String[] args) { short i; //i=i+1; i+= 1; }}//编译通不过,variable i might not have been initialized
public class add { public static void main(String[] args) { short i=0;i=i+1; i+= 1; }}//编译通不过,possible loss of precision so 需要初始化,亦要类型转换
short i; i = i+1; //报错i+= 1; //正确解答: 1.因为i=i+1;要进行类型转换 i+1会转换成int类型!右边是int,左边是short类型,所以报错! 2.i+=1;则不进行类型转换,所以正确!
我实际测试了一下,我感觉楼上的xdjm们都在考虑变量的各种问题了,但是我发现好像这个问题跟变量没有太大的关系,真正有关系的是那个“+”!我尝试了 i = i + (short)1;理论上说,这样右边两个数都是short的,返回给i的也是short的,就没有自动的类型转换了。可是即使这样,编译还是错误,并且在cmd窗口下用javac编译的时候提示错误在+的位置上。所以,我认为,真正原因在于:+是一个要求两边都是int型或者以上的运算符。或者,只要用到+运算符的地方,所有的计算都被转换为int或者以上的计算。而楼上有人提出的 i = (short)(i + 1);这种做法是完全否定了+的自动转换,没有办法实际测试出真正原因的。
i = (short)(i + 1);行的!
short i; i = i+1; //报错 首先,i 是short型的, 1 是int型的,i+1的结果是int型,而由于i是short型,将int型赋值给short型变量除非用强制类型转换,否则报错。 i+= 1; //正确 “+=”是复合加,这个和上面表达式是一个意思,唯一不同的是 它会把结果 隐式转换成需要的数据类型。。后面的贴子当中发现有些人的编码习惯不是很好。声明变量时请记得初始化。 算术运表达式在计算时会出现自动数据类型转换。例如:short=>int=>long=>float=>double几种类型数据进行混合运算时,会出现由低到高自动转换。
i = i+1; //报错 在这里 i+1是个表达式 需要一个中间寄存器保存这个结果,这个寄存器是个int型的。i+= 1; //正确 这里是自增,自增是话,只要在i自已这个寄存器里加1便是
所有数字型的自增溢出都不会报错的,比如 int i = 2147483647; i+=1;是不会报错的,而int i = 2147483648是会的错的。
这个好像是JAVA前三堂课的内容. short i;//建议初始化,默认初始化为0 i = i + 1;//首先明确,先算+,后赋值.i为short值为0,1为int. //通过自动类型转换,得到1类型int.即:i = 1.赋值时右侧转化为左侧. //int型无法强制类型转换为short型.报错. i += 1;//这个不是赋值,没有规定一定要右侧转化为左侧.占用内存低的向占用内存高的转化. //不报错.不要把+=拆开看.这是一个运算符.i += 1更接近i++而不是i = i + 1.
short i;
i = i+1; //报错
首先,i 是short 型的, 1 是int型的
i+1的结果不回自动转换成short 所以报错。
i+= 1; //正确
这个和上面表达式是一个意思,唯一不同的是
它会把结果 隐式转换成需要的数据类型。。
要把程序写的让别人看的很明白,就不提倡这种表达方式。
a = 1;是不是说把1隐式转换成了short型,然后再赋给short型的变量a呢??
整数1是叫字面量吧,默认是int型的吗??谢谢帮忙再解释一下啊,这个问题把人真是弄糊涂了,呵呵!谢谢啦
要说问题的话,变量i没有初始化就使用还算得上个错误。至于是int还是short,这种问题编译器会告诉你错在哪里的,不同语言也有不同的处理。
i+=1
可以写成 i = i+1
+优先级别比=高.
所以会先做i+1运算
因为1是int型,而i是short型.这个表达式会自动进行类型转换.
i转换成int型.
所以i+1赋值给i的时候不会出错.
以前一直以为short型只是要求整数不越界就可以了
a = 1;是不是说把1隐式转换成了short型,然后再赋给short型的变量a呢??
整数1是叫字面量吧,默认是int型的吗??谢谢帮忙再解释一下啊,这个问题把人真是弄糊涂了,呵呵!谢谢啦
这个问题我也在思考,请牛人重出江湖!
a = 1;类型错误这个问题是可以通过的
class Test1{
public static void main(String args[]){
Boolean b=new Boolean("vb");
float f=123;
byte k=1;
int x=(int)(1.23);
short s=128;
System.out.println(k);
}
}他会自动初始化为0,你没有在方法中使用他的时候是不报错误的,如果使用了他,如下
class Test1{
public static void main(String args[]){
Boolean b=new Boolean("vb");
float f=123;
byte k;//报错
int x=(int)(1.23);
short s=128;
System.out.println(k);
}
}
但是
byte k=1; //1不是墨认为INT吗?怎么没错误?一直没解决这问题,请牛人超人超级杀赖人出来路面
a = 1l;不能通过召唤牛人
short a = 32767; //通过
short b = 32768; //can't convert int to short在初始化short变量时java根据整型常量的范围来确定它的类型?
高手指顶
public class Add {
public static void main(String[] args) {
short i;
i = i+1; //此处是在i没有初始化的情况下就使用了i,错误.
i+= 1;
}
}
其次,关于数据类型转换在java中有两种:
第一种,强制类型转换,不用我多说,大家都很清楚.
第二种,隐式类型转换,就是以上别人所说的自动类型转换.它的转换规则如下:
基本原则:如果两者的类型不一致,则系统会自动转换为较高(即取值范围较大)的类型
详细说明:
(byte或short)与int型运算,转换为int型;
(byte或short或int)与long型运算,转换为long型;
(byte或short或int或long)与float型运算,转换为float型;
(byte或short或int或long或float)与double型运算,转换为double型;
char型与int型运算,转换为int型。
不过有些我也不太理解,在32位编程下,为什么long型的与float型的进行运算却要转换成float型,而不是double型.想一想long型是8个字节,而float型只是4个字节.是否有点违返了上面的基本原则呢?求高手帮一把!!!
不过这个转换过程可能会丢失一定的精度
float f=123;
byte k;//报错
我想问问 这段程序是对的吗?
你说它是什么呢?有可能是char型的,也有可能是int型的还有可能是float 型的 只有变量谈类型才有意义,比如:char a='1';int a=1;float a=1;有一点要注意int型和float型变量都有最大最小范围,只要不超出范围都没问题!还有个自动类型转换的问题,那跟翻译器有关的,但基本都是差不多的,比如整型的和浮点型的在一起搞整型就转换成浮点型,一般都是向数值范围大的转,转换规则书上都是有的!
long型是4个字节,float型也是4个字节
得出的结果是int整型.
而i依然是short型.
int整型比short是要大的类型.
大的类型不能隐式转换成小的类型.
若真要转换,要用强制转换
楼主,你试下在
i=i+1
改成i=(short)i+1
试试.不再回贴了.楼主不认真看书问来问去的都是一个问题!
1是常量,而且i+1也没有超出short的返回啊!
因为1默认的是int型,所以i(short)自动转换为int
TO benewu(雪枫)
i=i+1
i=(short)i+1//里面用了+运算符号,首先(short)i时候i为short,遇到+运算自动转换为int
另外不是short例如char,byte一样是这么转换的
2.i = (short)i + 1;表示什么意思? i本来就是short型的,还强制什么?
应该是i = (short)(i + 1);
public static void main(String[] args) {
short i;
i = i+1; //报错
首先,i 是short 型的, 1 是int型的
i+1的结果不回自动转换成short 所以报错。
i+= 1; //正确
这个和上面表达式是一个意思,唯一不同的是
它会把结果 隐式转换成需要的数据类型。。
要把程序写的让别人看的很明白,就不提倡这种表达方式。
同意
不过想请教二楼的,如果不初始化i,i+=1是否依然正确??
public static void main(String[] args) {
short i;i=(short)(i+1);
i+= 1; }}//编译通不过,variable i might not have been initialized
public class add {
public static void main(String[] args) {
short i=0;i=(short)(i+1);
i+= 1; }}//Process completed.public class add {
public static void main(String[] args) {
short i;
//i=i+1;
i+= 1; }}//编译通不过,variable i might not have been initialized
public static void main(String[] args) {
short i=0;i=i+1;
i+= 1; }}//编译通不过,possible loss of precision
so 需要初始化,亦要类型转换
1.不是初始化的问题,说是初始化的问题的人,你们怎么不调试,试一试?
2.i = (short)i + 1;表示什么意思? i本来就是short型的,还强制什么?
应该是i = (short)(i + 1);
"
哈哈....
竟然也犯了错误喀喀,把括号都忘了.
的确应该是i = (short)(i + 1);
这里在ECLIPSE中报了两次错
一次是类型转换
一次是变量初始化
楼上的
不防找台电脑试一试
short i;
i = i+1; //报错i+= 1; //正确解答:
1.因为i=i+1;要进行类型转换 i+1会转换成int类型!右边是int,左边是short类型,所以报错!
2.i+=1;则不进行类型转换,所以正确!
i = i+1; //报错
首先,i 是short型的, 1 是int型的,i+1的结果是int型,而由于i是short型,将int型赋值给short型变量除非用强制类型转换,否则报错。
i+= 1; //正确
“+=”是复合加,这个和上面表达式是一个意思,唯一不同的是
它会把结果 隐式转换成需要的数据类型。。后面的贴子当中发现有些人的编码习惯不是很好。声明变量时请记得初始化。
算术运表达式在计算时会出现自动数据类型转换。例如:short=>int=>long=>float=>double几种类型数据进行混合运算时,会出现由低到高自动转换。
Java中,所有整数的算术运算都会产生int型的结果(除非有long参与其中)。所以在下面的代码中:byte b1 = 1;
byte b2 = 3;
byte b3 = b1 + b2;b1和b2虽然都是byte,但根据上面“所有整数的算术运算都会产生int型的结果”的规则,b1+b2却是int(虽然结果仍没有超出byte的取值范围),这样在将int赋给byte时当然需要一个显式转换。说到底,什么东西可以编译,什么东西不可以编译,完全是语言对编译器的一种规定,而这种规定完全是人为的。就像Bruce Eckel说的“早期的C编译器什么样的代码都可以编译”,这时,你就必须自己规定自己了。而目的只有一个,就是写出高效、健壮的程序。
a = 1;
是不是说把1隐式转换成了short型,然后再赋给short型的变量a呢??
整数1是叫字面量吧,默认是int型的吗??在 Java 语言中,byte、short、与 char 型态就和整数、浮点数一样,有著相同的地位。
但是,在 JVM 中,byte、short、与 char 不过是「次级公民」,指令的支援程度不及 i
nt 和 float 的完整当你指定某值给 byte、short、或 char 的栏位时,你传给 JVM的是 int,但
是它会自动被截短为适当的体积///////////
我尝试了 i = i + (short)1;理论上说,这样右边两个数都是short的,返回给i的也是short的,就没有自动的类型转换了。可是即使这样,编译还是错误,并且在cmd窗口下用javac编译的时候提示错误在+的位置上。
取出此 byte、short
、或 char 的栏位值时,它们就会自动转型为 int 型态,然後你的程式取得的是 int 值也就是运算时是int型
i=i+1;
1为整型超过了i的范围;
i=i+1
则将i自动转化为整型所以不会出错
这之後i+1的值为int型,赋给short型的i就会出错
short i;//建议初始化,默认初始化为0
i = i + 1;//首先明确,先算+,后赋值.i为short值为0,1为int.
//通过自动类型转换,得到1类型int.即:i = 1.赋值时右侧转化为左侧.
//int型无法强制类型转换为short型.报错.
i += 1;//这个不是赋值,没有规定一定要右侧转化为左侧.占用内存低的向占用内存高的转化.
//不报错.不要把+=拆开看.这是一个运算符.i += 1更接近i++而不是i = i + 1.
------------------------------------------
说的好,学习……
比如:
short i=1;
short j=2;
i=i+j; //报错
i+=j; //正确
Dan1980 说的好
// short i;
i = i+1; //报错 (还会抱错吗?)i+= 1; //正确}}请哪位牛人帮忙解答一下啊!
成员变量只有成员方法可以访问,除非你把它定义成static的。
public static void main(String[] args) {
short i=0;
i+= 1; //正确}}
编译成class
G:\>javap -c Add
Compiled from "Add.java"
public class Add extends java.lang.Object{
public Add();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: i2s//自动进行类型转换了
6: istore_1
7: return}
要问为什么自动进行类型转换,只有请教JAVA之父了