黑马程序员技术交流社区

标题: i +=i-1 以后 i 的值 [打印本页]

作者: 8047107    时间: 2013-6-25 15:16
标题: i +=i-1 以后 i 的值
设有定义int i=6,则执行以下语句后,i的值为( );
i +=i-1;
回复以后看正确答案哈.不过我看不懂....



作者: 神之梦    时间: 2013-6-25 15:51
11                    
作者: 8047107    时间: 2013-6-25 16:06
神之梦 发表于 2013-6-25 15:51
11

嗯 怎么计算的啊?
作者: 8047107    时间: 2013-6-25 16:07
神之梦 发表于 2013-6-25 15:51
11

从左到右的顺序?先执行 i+=i  
i=12 了  然后再减一  就是11啦? 就这样?
作者: 张承富    时间: 2013-6-25 16:10
11,i+=i-1相当于i=i+i-1
i+=就是i=i+
作者: 神之梦    时间: 2013-6-25 16:11
8047107 发表于 2013-6-25 16:07
从左到右的顺序?先执行 i+=i  
i=12 了  然后再减一  就是11啦? 就这样?

+=相当于一个赋值语句,从定义上和=差不多,只是在赋值的同时,它会将左边的数与右边的数相加然后再赋值给左边的变量,这个动作是自动完成的。
所以先i-1,然后i+(i-1)结果。。。。。。。。。。
作者: 8047107    时间: 2013-6-25 16:16
神之梦 发表于 2013-6-25 16:11
+=相当于一个赋值语句,从定义上和=差不多,只是在赋值的同时,它会将左边的数与右边的数相加然后再赋值 ...

哦 明白了. 不知道你看了别人发的一个帖子没
int j=0;
for (int i =0;i<100;i++)
{
  j=j++;
}
然后打印j的值是0~~~
如果只循环一次的话还好理解.j最开始=0.循环里面是先赋值再自增,第一次打印的肯定是0,但是循环结束后 j不是自增为1了么.怎么一直都是0
那个帖子有人给了一个内存图 但是看不太明白 而且看他的图好像是先自加再赋值的~~~~
作者: 神之梦    时间: 2013-6-25 16:26
8047107 发表于 2013-6-25 16:16
哦 明白了. 不知道你看了别人发的一个帖子没
int j=0;
for (int i =0;i

继续找那人让他给你解释
他那说法确实是正确的
我以前也问过类似的问题,你我看以前自增问题的帖,有位大牛用反汇编弄过,
这是java的不同之处吧,具体怎么搞的我不是特别明白,也解释不清
如果你不想去懂内存开辟的啥问题的话,你只要记住,这样的等式:
你可以这样理解,就J=j++而言,我们知道j++是先赋值再自增,所以一开始的时候是自增前的值赋值给了j,
然后j的值就保存在了主内存中,而后又开辟了一个新内存用来运算j++,但因为已经赋值过了
所以j++的那片内存就等于无用功,没起作用,自动释放,所以j的值就一直是原来的值。
以上纯属个人理解,如有不妥望指出

作者: 8047107    时间: 2013-6-25 16:31
神之梦 发表于 2013-6-25 16:26
继续找那人让他给你解释
他那说法确实是正确的
我以前也问过类似的问题,你我看以前自增问题的帖,有位大 ...

嗯不错 有点可以理解了
作者: 王靖远    时间: 2013-6-25 16:36
11            
作者: 梅英平    时间: 2013-6-25 16:53
答案是:2i-1,么
作者: 郭伟杰    时间: 2013-6-25 17:44
次句子可以理解为
i=i+(i-1);
作者: 刘_鑫    时间: 2013-6-25 18:22
public static void main(String[] args) {
        int i =6;
        System.out.println(i+=i-1);
}

结果11 ,应该是先算+=  6+6= 12  再-1吧。
作者: 8047107    时间: 2013-6-25 19:00
刘_鑫 发表于 2013-6-25 18:22
public static void main(String[] args) {
        int i =6;
        System.out.println(i+=i-1);

额 大家说的是先计算+=右边的 即 i-1 先计算   6+5=11
作者: 曹秀云    时间: 2013-6-25 19:42
回个贴又不会怀孕
作者: 王瀛    时间: 2013-6-26 22:49
11

难道是 肖同学{:soso_e141:}
作者: 280270738    时间: 2013-6-27 13:49
i=i+(i-1)     答案是11
作者: 以防万一    时间: 2013-6-27 13:51
我来看看
作者: 以防万一    时间: 2013-6-27 13:53
结果为11
因为这个语句整体是从等号左右分开,左边加右边将和赋给左边,然后右边是i-1为5,i=6,然后执行左边加右边赋给左边,所以结果为6

不知道楼楼能看明白不
作者: 万琪    时间: 2013-6-27 14:06
搂主,,就是这样了

秒懂了吧!

int i;

i +=(+=) -1;

作者: 王广亚    时间: 2013-6-27 16:29
结果是11
作者: 王广亚    时间: 2013-6-27 16:43
结果是11
这里牵连到运算符优先级和结合性的问题,int i=6;i +=i-1;“-”为算数加减运算符,优先级为4;而“+=”是赋值运算符,优先级为14,低于加减运算符。所以要先算“i-1”。
附上运算符的优先级和结合性的表:

优先级 描述 结合性
1 分隔符 右到左
2 对象归类,自增自减运算,逻辑非 左到右
3 算术乘除运算 左到右
4 算术加减运算 左到右
5 移位运算 左到右
6 大小关系运算 左到右
7 相等关系运算 左到右
8 按位与运算 左到右
9 按位或运算 左到右
10 按位或 左到右
11 逻辑与运算 左到右
12 逻辑或运算 左到右
13 三木条件运算 左到右
14 赋值运算  右到左

作者: 王广亚    时间: 2013-6-27 16:56
8047107 发表于 2013-6-25 16:16
哦 明白了. 不知道你看了别人发的一个帖子没
int j=0;
for (int i =0;i

这个题很有意思,我也想知道怎么回事?建议楼主可以另发一贴。
作者: 王广亚    时间: 2013-6-27 16:58
8047107 发表于 2013-6-25 16:16
哦 明白了. 不知道你看了别人发的一个帖子没
int j=0;
for (int i =0;i

这个题很有意思,我也想知道怎么回事?建议楼主可以另发一贴。
作者: 8047107    时间: 2013-6-27 20:56
版主改成以解决把!
作者: jasonzue    时间: 2013-6-27 22:06
11.。 i += i-1相当于 i= i+(i-1);的简写吧

作者: ybxiang    时间: 2013-6-28 00:23
i +=i-1;等价于i=i+i-1=6+6-1=11;
作者: lipingan0520    时间: 2013-6-28 07:58
:)看看学习学习
作者: yhb401712942520    时间: 2013-6-28 09:34
答案是11
作者: yhb401712942520    时间: 2013-6-28 09:35
i += i-1
就是i=i+i-1;
int i =6;
所以结果是11;
作者: hx32    时间: 2013-6-28 11:17
8047107 发表于 2013-6-25 16:16
哦 明白了. 不知道你看了别人发的一个帖子没
int j=0;
for (int i =0;i

j++是赋值之后再+1,但是+1的结果没有使用,内存就释放掉了。
关键点在于内存的释放
作者: ヾMyHeartIsDead    时间: 2013-6-28 18:10
11
是从左往右算,"i+"=12
然后-1 =11   
作者: 郑先明    时间: 2013-6-29 11:23
我猜答案是11..
作者: x.love    时间: 2013-6-29 12:50
i = i+(i-1)吧
作者: x.love    时间: 2013-6-29 12:50
应该相当于i=i+(i-1)
作者: 阿凡提不买驴    时间: 2013-6-29 14:34
11,还是通过编译运行得出,是优先级问题,学习的路子太长了




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