黑马程序员技术交流社区

标题: 第11课:赋值语句和赋值表达式 [打印本页]

作者: 滔哥    时间: 2014-8-13 17:39
标题: 第11课:赋值语句和赋值表达式
声明变量以后,可以使用赋值语句为它赋一个值。在Java中,我们用一个等号(=)作为赋值运算符。赋值语句的语法是:
  1. x = 1;
复制代码

如果我们在声明一个变量的同时为它赋值,这种行为一般叫做初始化:

  1. int x = 1;
复制代码

我们也可以在一条语句中给多个变量赋值:

  1. x = y = z = 1;
复制代码
对于数学计算,Java还有一套更加简捷的赋值运算,它们的作用是对变量当前的值进行修改,然后再重新赋值给这个变量的情况,例如:

  1. i += 1;    //相当于
  2. i = i + 1;
复制代码

这两条语句是一样的,第一种形式的“+=”叫做加法赋值运算符。相应的,我们还有减法赋值运算符、乘法赋值运算符、除法赋值运算符和求余运算符。

  1. i -= 1;   i = i – 1;
  2. i *= 1;   i = i * 1;
  3. i /= 1;   i = i / 1;
  4. i %= 1;   i = i % 1;
复制代码

另外,Java还有更复杂一些的自增运算符:

  1. ++i 前置自增运算符,相当于i = i + 1
  2. i++ 后置自增运算符,相当于i = i + 1
  3. --i 前置自减运算符,相当于i = i - 1
  4. i-- 后置自减运算符,相当于i = i - 1
复制代码
尽管前置和后置都是将变量i的值进行修改,但是在本质上还是有所不同的。下面我们来解释一下前置和后置的区别,大家要好好体会:

  1. //后置自增运算符
  2. j = i++;  //相当于:
  3. j = i;
  4. i = i + 1;
  5. //前置自增运算符
  6. j = ++i;   //相当于
  7. i = i + 1;
  8. j = i;
复制代码

很明显,j的结果是不同的,感受到了么?

第12课:String类型
作者: czwanglei    时间: 2014-8-13 17:48
占个沙发坐坐。
作者: 狐狸FMF    时间: 2014-8-13 18:09
i=1;i=i++;如果再输出i的值 结果是1 ,按照 i=i;i=i+1的算法不应该是2么??
作者: liqiaohui    时间: 2014-8-13 20:25
++i是将两边都加再赋给左边       i++是右边的自加赋给左边
作者: 张周飞    时间: 2014-8-14 09:19
学习来了....
作者: 想做开发    时间: 2014-8-14 09:43
来学习了   
作者: alexchy    时间: 2014-8-14 10:11
这么给力 涛哥 前排
作者: ⋛⋌⋚JEEP    时间: 2014-8-14 18:04
本帖最后由 ⋛⋌⋚JEEP 于 2014-8-14 18:08 编辑

2楼说i=1;i=i++;如果再输出i的值 结果是1 ,按照 i=i;i=i+1的算法不应该是2么??
针对这个问题,我的理解是,java的编译器的问题。在c\c++中结果是2,因为他们的编译器不同所以编译机制也不同。
具体是为什么呢?
可以用java的分解类工具javap看看,i++的情况
iconst_0 //把int类型的值压入栈顶
istore_1 //将int类型的值存入局部变量
iload_1 //从局部变量中装载int类型的值
iinc 1,1 //把常量值1加到局部变量上
istore_1//把栈顶的int类型的值存入变量中

首先,整数常量1存到栈顶(类似缓存空间),然后把栈顶的值赋给int型变量i ,将“int i =1”加载入栈,
栈中变量i自增1,此时i=2,(直到这里我们讨论的都是“=”右边的部分)
最后,把栈顶的1赋值给“=”左边的i,结果i=1还是1.(这里讨论的是“=”左边的部分)

总结:i = i++;先看“=”右边再看“=”左边;看右边时是把i初始的值1先保存到一个内存空间里,然后在栈中i的值自增1,最后JVM并没有将1赋给左边,而是将最初放在栈顶的1值赋给左边的i,所以结果还是1.


作者: 一顿一只牛    时间: 2014-8-14 21:39
太给力了
作者: 钟翠翠    时间: 2014-8-15 10:45
滔哥辛苦  必须顶起!
作者: 依然超级赛亚人    时间: 2014-8-15 15:31
“x = y = z = 1;”这样恐怕不行吧?之前遇到过这样定义方式,会报错啊?C语言中可以,java中似乎不行啊?难到这一点上我有不知道的东西,请求明示。
作者: 华谦    时间: 2014-8-17 10:30
哥们来啦
作者: 毛富强    时间: 2014-8-20 09:52
刚开始学的时候  老师分不清 =   和==   的区别呢。。。
作者: 波风梅西    时间: 2014-8-21 14:21
又复习了一遍
作者: wfaly    时间: 2014-8-23 22:46
复习了,Thanks
作者: 28了还能学吗    时间: 2014-8-29 11:20
滔哥  一直打成涛哥
作者: wujiemin    时间: 2014-10-7 23:46
这么给力 涛哥 前排
作者: HMSK    时间: 2014-10-14 17:17
太赞了,通俗易懂
作者: 红楼    时间: 2014-12-18 19:08
i+=1  隐藏了一个强制类型转换   
作者: Ogre    时间: 2014-12-19 00:03
{:3_57:}涛哥弄个目录出来啊,我看你java连接不上,中间缺了几课
作者: Jennifer    时间: 2014-12-19 00:32
++在前与++在后当时学习的时候也确实巩固了好几天才完完全全弄清楚的,今天看到涛哥的帖子,在复习复习
作者: wangzhao    时间: 2017-2-28 09:23
顶!d=====( ̄▽ ̄*)b
作者: baby14    时间: 2019-7-16 07:27
多谢分享




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