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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

laugh

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

5黑马币
[qq]354017992[/qq]
各位大神晚上好,我一个零基础自学java的新人有个不懂的地方想问下大家,如果感觉问的太幼稚,请轻喷。:)
我自学是看的毕老师的视频,在看到变量与常量的时候有点迷惑

如题
在变量自动和强制类型转换中,同一个字母x,表达的意思不一样,这样不冲突吗?如果有多个定义,那么x该取哪个值?例如:
数据类型    变量名=初始值
int    x=3
x=x+3,


可不可以有x=x+y?若可以,那么java会取两个x钟哪一个?

最佳答案

查看完整内容

二楼说的正确,x = x +3与数学中的未知数不同,定义一个变量,这个变量就类似于一个容器 int x=3 x=x+3, 等式右边就好比水,左边就好比杯子,int x=3,就等同于把3个量的水加到x这个杯子里, x=x+3,此时右边的杯子中有3个量的水,再加3个量的,倒入到左边的杯子里。 这个就是赋值运算,和传统数学中的未知数不同 ...

30 个回复

倒序浏览
二楼说的正确,x = x +3与数学中的未知数不同,定义一个变量,这个变量就类似于一个容器

int    x=3
x=x+3,
等式右边就好比水,左边就好比杯子,int  x=3,就等同于把3个量的水加到x这个杯子里,
x=x+3,此时右边的杯子中有3个量的水,再加3个量的,倒入到左边的杯子里。
这个就是赋值运算,和传统数学中的未知数不同
回复 使用道具 举报
变量名是唯一的,对于int x = 3; x = x+2;表示取出x的值3,加上2,然后将结果再存到x。你可以认为x是一个存放东西的盒子
回复 使用道具 举报
可以,最后结果会赋值给等号左边的x
回复 使用道具 举报
cherry@cookie 来自手机 中级黑马 2014-9-16 01:25:19
报纸
类型转换,你写的不会发生类型转换,因为x为int型,x+3仍为int型,所以不存在类型转换,如果定义byte  x=3      ;x=x+3会发生自动类型转换,如果定义char     x=‘3’;int   y=(int)(x+3);会发生强制类型转换,纯手机打字,有错的地方望见谅,毕老师的视屏讲的很详细,多看看就理解了。
回复 使用道具 举报
cherry@cookie 来自手机 中级黑马 2014-9-16 01:27:54
地板
自动类型转换byte,short,->int
回复 使用道具 举报
强制转换只需理解成不同类型的变量,位数少的转换成位数多的变量类型进行运算
回复 使用道具 举报
夕默 中级黑马 2014-9-16 10:07:49
8#
你可能是第一次接触编程语言,其实,在计算机运算诸如x=x+2的计算公式时,是先运算x+2,再将x+2的计算结果赋给x。(从右往左进行运算)这个还涉及到运算符运算的优先级问题。楼主可以看看优先级的相关知识,这样理解x=x+2相对清晰些。
其次,这里的x是一个内存单元的名字,这里的x所代表的内存单元里面所放的内容是可以读可取的。计算机在进行x=x+2处理时,首先计算x+2,这时在内存中读出x的初始值3,然后将3加上2的结果5赋给x(x=5)。

以后还会涉及到深一点的诸如difine宏定义的内容(貌似这个很喜欢考),懂得了计算机是怎么处理的就好理解多了。
回复 使用道具 举报
夕默 中级黑马 2014-9-16 10:19:37
9#
如果你已经定义了x,也定义了y,这两个值都是有效值,那么先取x与y进行和运算,再将结果赋给x。其实这两个x代表的是一个内存空间位置。“=”这个赋值运算将x的原始值覆盖掉了。
回复 使用道具 举报
看了你的问题,感觉你应该是对变量的在内存中的存储原理还不是很清楚!下面我发表我的一点拙见,希望能够对你有些帮助。
首先,当你在int x = 3时,java虚拟机会在内存中开辟出一块空间用来存储int类型的数据,而你给其赋了一个初值3,你要知道变量一旦创立出来了它就总在内存中占了一个存储数据的位置(直到被java虚拟机回收或者程序终止),然而这个存储位置上的存储的数据是可以改变的,你最初给其赋了一个初值3,然而下面你想要改变这个变量的值,你可以将其再赋另外的值比如:5(x = 5),这样最初那个值3就会被消除而5这个值就会被添加在这个位置上。
回复 使用道具 举报
其实就是一句话,编译器先从右边开始编译,也就是说先从右边开始运算,当运算右边的时候谁知道左边有一个同样的变量呢,等右边运算完在看左边,这才发现左边的也是同一个变量,那又怎样呢?右边的运算已经结束了
回复 使用道具 举报
你的提问让我比较困惑,首先,一个变量标识符在它的作用域范围内是不可能出现二义性,如果有,那么至少会产生一个编译时错误;还有,你说的 如果有多个定义,我不太明白是什么意思,假设是一个标识符被重复定义了,并且通过编译了,那么在这些若干定以后使用它肯定是取最后一次定义的结果的。
回复 使用道具 举报
往往编程里的“=”你可以看成是赋值符号,这里的x就是一个无名变量,右边给它=个什么,它就变成了什么,所以最终JAVA只取进过计算后的左边的x,右边的只是算法的一部分,不是最终结果。现在,应该比较通俗易懂了吧。
回复 使用道具 举报
黑马币给不给啊。。。
回复 使用道具 举报
MR.J 中级黑马 2014-9-16 21:07:42
15#
其实这种问题没必要用黑马币来提问,你发了一般会有人给你回复。黑马币不好挣的。以后要用来换技术分为好。
还有就是,x的类型会取哪一个,这题中的两个x类型是一样的,所以不会区分。

如果有多个类型的定义,最终取什么样的类型,会在运行过程中有语句体现,比如int型的x,最终要与double型的y相加,要看要求最终保留什么类型的,如果要保留int型的,你就把double型的y用    (int)b强转就行了。你不用想太复杂。
回复 使用道具 举报
关于基本类型转化与提升问题

1、自动类型转换:

也成为隐式类型转化。当一个“小”(指范围小)数据与“大”数据进行运算时,java默认会向“大”数据方向转换,然后再运算,如上面的程序中的运算,就是讲i = 5转为i = 5.0在和f进行运算,然后再提升为double类型。

注:

a.所有byte、short、char类型的值将提升为int类型。

b.自动类型转换关系:byte -->short(char) -->int -->long -->float -->double

2、强制类型转换:

和自动转换类型相反,格式:int i = (int)6.53;,就是将“大”数据强转为“小”数据。

注:

a.会损失精度,如6.53转完后为6,会将小数点后的值去除,只保留整数位。

b.强制类型转换关系:double -->float -->long -->int -->short(char) -->byte

c.对于int m = (int)'a';//结果为97,因为a在ASCll码中的值为97。
回复 使用道具 举报
定义变量最后赋给的值才会保留,之前的就会消失了。所以按程序的运行顺序,最后面赋给的值就是变量的值。
回复 使用道具 举报
所谓变量,就是内存里面的一个区域,用来存储数据的。举个例子,变量就好比一个透明的盒子,里面可以放置你事先安排好的东西,比如放水果。当你放苹果在里面的时候,它就是苹果,但是后面我想要放个梨进去,所以就得把苹果拿走,然后才能放梨进去。

关于lz问的: int x = 3;  x = x + 3;  或  x = x + y;  取值的问题,就是先把3存到x里面。然后x = x+3;这个语句要先运算x+3,然后运算结果在赋给x。  x =x+y; 也是同理。


ps  我也是看毕老师视频自学的,比你提前了一点,以后有什么问题,可以来多多交流。
回复 使用道具 举报
可以有x=x+y,前提是要定义x,y,将x,y的值相加赋值给x。
强制转换在x,y的类型不同是使用。
回复 使用道具 举报
x当然取最近被付的值
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马