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

© Faith- 中级黑马   /  2014-8-5 23:54  /  4317 人查看  /  28 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  public  class demo {
       public static void main(String[] args)
         {
                 int i=0;
                 i=(i++);
                 System.out.println("i="+i);
         }
}


为什么i 的结果是0而不是1? 括号没有作用吗?

28 个回复

正序浏览
路过~~~~~
回复 使用道具 举报
本帖最后由 黑马黄武先 于 2014-8-6 15:27 编辑

区别在于i++是i先不自加,在语句完后自加,++i先自加;就是这个意思了。搞了半天我也明白了,哈哈i=(++i);的结果是i=1,
i=(i++);的结果是i=0。
回复 使用道具 举报
只能说 这里的括号没有作用  没有起到让 i++ 优先运算的效果
回复 使用道具 举报
Faith- 发表于 2014-8-6 07:44
缺少什么表达式?? 这个程序有错误?

说错了,兄弟,把i=(i++);的挂号去了,就可以了.
int i=0;
i++;
System.out.println("i="+i);
这样打印的结果就是1了.

java.jpg (38.56 KB, 下载次数: 21)

java.jpg
回复 使用道具 举报
i=(i++);会先把0赋值给i
回复 使用道具 举报
学习一下
回复 使用道具 举报
++i是先自增1再赋值,i++ 是先赋值再自增1
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 11:22
还是没认真看我原话:

谢谢您  ok了
回复 使用道具 举报
误人子弟来也

无标题.jpg (100.78 KB, 下载次数: 16)

无标题.jpg
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 11:22
还是没认真看我原话:

OK谢谢,加深理解了下又:hug:
回复 使用道具 举报
dreamseekerkun 发表于 2014-8-6 11:09
int i =0;
if(i==i++&&i==1)
   System.out.println(i);

还是没认真看我原话:
赋值语句=右边的表达式必须先计算完毕之后才会将值赋给=左边的变量。所以必须等i++的自增效果完成,且i++表达式的值0计算完毕之后,才会将i++的值0赋值给=左边的i,因此i最后是0


i++确实让i自增了,可是最终的结果是i++表达式的值0又被赋值给i,i从1又被改写为0 至于你说的==运算符,它跟=不一样。==没有赋值的功能,所以i++后i是1,i==i++后i还是1 但是,i == i++为真的原因并不是==左右都是1 ,而是因为==左右都是0
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 10:26
我没说先把i赋值给左边再+1,你再仔细看我的两段原话:

赋值语句=右边的表达式必须先计算完毕之后才会将 ...

int i =0;
if(i==i++&&i==1)
   System.out.println(i);
这样结果就是1,括号里先比较第一个为真,接着判断i==1;这一步时,i已经变成1了吧。
----------------------------------------------------------
int i = 0;
i = i++;
System.out.println(i);//这个按说赋值完,最后输出的i应该也是1啊,脑子没转过弯来,和第一个有啥区别,求解答
回复 使用道具 举报
Faith- 发表于 2014-8-6 07:56
您看昂   按您说的这样如果先把 i 的值赋值给等号左边,然后在执行i+1的动作,那最后输出 i 的值不就是1 ...

我没说先把i赋值给左边再+1,你再仔细看我的两段原话:

赋值语句=右边的表达式必须先计算完毕之后才会将值赋给=左边的变量。所以必须等i++的自增效果完成,且i++表达式的值0计算完毕之后,才会将i++的值0赋值给=左边的i,因此i最后是0

i的值与i++(或++i)的值是两回事。i = i++。++后缀形式的表达式值是未自增前的i,++前缀形式的表达式值是自增后的i
回复 使用道具 举报
fantacyleo君的表述是多么清楚呀
回复 使用道具 举报
***有括号呢要先算括号里的,赋值跟自增顺序是有区别的
    算是算,赋值是赋值
++i;
先加一然后在赋值
i++;
先赋值在自增一
举个例子 for(int i=0,i<5;i++){ }
i=0进入for循环,循环一次之后i+1;

回复 使用道具 举报
fantacyleo 发表于 2014-8-6 00:36
我明白了,你糊涂的原因不是优先级,而是对++的误解。++有两种形式:
1. 前缀 如++i
2. 后缀 如i++

您看昂   按您说的这样如果先把 i 的值赋值给等号左边,然后在执行i+1的动作,那最后输出 i 的值不就是1吗,
第二个问题:括号在这里到底有没有作用?它的优先级在这里忽略了?
回复 使用道具 举报
黑马黄武先 发表于 2014-8-6 01:15
不是的,你缺少表达式了,这怎么能+1呢!!

缺少什么表达式?? 这个程序有错误?
回复 使用道具 举报
Faith- 发表于 2014-8-6 00:16
++不是自增运算吗,0++不就是0+1吗

不是的,你缺少表达式了,这怎么能+1呢!!
回复 使用道具 举报
dreamseekerkun 发表于 2014-8-6 00:40
不是只有一个i吗,即使先赋值在运算,那么最后i应该是1啊,只有一个啊,一说,我也有点晕了 ...

。。。我刚说完“i的值与i++(或++i)的值是两回事”
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马