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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Faith- 中级黑马   /  2014-8-5 23:54  /  3917 人查看  /  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 个回复

倒序浏览
class Demo
{
        public static void main(String[] args)
          {
                  int i=0;
                  i++;
                  System.out.println("i="+i);
          }
}
回复 使用道具 举报
定义变量的时候已经赋值给i了,i就是0,然后你下面又搞个,i=(i++)不就是0++么?打印结果当然是0啊!
回复 使用道具 举报
你加不加括号都一样。Java语言规范规定:赋值语句=右边的表达式必须先计算完毕之后才会将值赋给=左边的变量。所以必须等i++的自增效果完成,且i++表达式的值0计算完毕之后,才会将i++的值0赋值给=左边的i,因此i最后是0
回复 使用道具 举报
黑马黄武先 发表于 2014-8-6 00:04
定义变量的时候已经赋值给i了,i就是0,然后你下面又搞个,i=(i++)不就是0++么?打印结果当然是0啊! ...

++不是自增运算吗,0++不就是0+1吗
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 00:07
你加不加括号都一样。Java语言规范规定:赋值语句=右边的表达式必须先计算完毕之后才会将值赋给=左边的变量 ...

不是括号的优先级高吗?在这里括号没有优先级吗
回复 使用道具 举报
梧桐树下 来自手机 中级黑马 2014-8-6 00:32:52
7#
I++是先把值付给左边,i在自加,i=i++的值为1,如果i=++i结果就是1了
回复 使用道具 举报
梧桐树下 来自手机 中级黑马 2014-8-6 00:33:55
8#
说错i=i++值为0
回复 使用道具 举报
Faith- 发表于 2014-8-6 00:16
++不是自增运算吗,0++不就是0+1吗

我明白了,你糊涂的原因不是优先级,而是对++的误解。++有两种形式:
1. 前缀 如++i
2. 后缀 如i++

这两种形式,i都会自增。但是,i的值与i++(或++i)的值是两回事。i = i++。++后缀形式的表达式值是未自增前的i,++前缀形式的表达式值是自增后的i。所以i = i++等价于 i = 0
回复 使用道具 举报
dreamseekerkun 来自手机 中级黑马 2014-8-6 00:40:39
10#
fantacyleo 发表于 2014-8-6 00:36
我明白了,你糊涂的原因不是优先级,而是对++的误解。++有两种形式:
1. 前缀 如++i
2. 后缀 如i++

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

。。。我刚说完“i的值与i++(或++i)的值是两回事”
回复 使用道具 举报
Faith- 发表于 2014-8-6 00:16
++不是自增运算吗,0++不就是0+1吗

不是的,你缺少表达式了,这怎么能+1呢!!
回复 使用道具 举报
黑马黄武先 发表于 2014-8-6 01:15
不是的,你缺少表达式了,这怎么能+1呢!!

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

您看昂   按您说的这样如果先把 i 的值赋值给等号左边,然后在执行i+1的动作,那最后输出 i 的值不就是1吗,
第二个问题:括号在这里到底有没有作用?它的优先级在这里忽略了?
回复 使用道具 举报
***有括号呢要先算括号里的,赋值跟自增顺序是有区别的
    算是算,赋值是赋值
++i;
先加一然后在赋值
i++;
先赋值在自增一
举个例子 for(int i=0,i<5;i++){ }
i=0进入for循环,循环一次之后i+1;

回复 使用道具 举报
fantacyleo君的表述是多么清楚呀
回复 使用道具 举报
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 发表于 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啊,脑子没转过弯来,和第一个有啥区别,求解答
回复 使用道具 举报
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 11:22
还是没认真看我原话:

OK谢谢,加深理解了下又:hug:
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马