黑马程序员技术交流社区

标题: 括号的优先级 [打印本页]

作者: Faith-    时间: 2014-8-5 23:54
标题: 括号的优先级
  public  class demo {
       public static void main(String[] args)
         {
                 int i=0;
                 i=(i++);
                 System.out.println("i="+i);
         }
}


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

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

不是括号的优先级高吗?在这里括号没有优先级吗
作者: 梧桐树下    时间: 2014-8-6 00:32
I++是先把值付给左边,i在自加,i=i++的值为1,如果i=++i结果就是1了
作者: 梧桐树下    时间: 2014-8-6 00:33
说错i=i++值为0
作者: fantacyleo    时间: 2014-8-6 00:36
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
fantacyleo 发表于 2014-8-6 00:36
我明白了,你糊涂的原因不是优先级,而是对++的误解。++有两种形式:
1. 前缀 如++i
2. 后缀 如i++

不是只有一个i吗,即使先赋值在运算,那么最后i应该是1啊,只有一个啊,一说,我也有点晕了
作者: fantacyleo    时间: 2014-8-6 00:42
dreamseekerkun 发表于 2014-8-6 00:40
不是只有一个i吗,即使先赋值在运算,那么最后i应该是1啊,只有一个啊,一说,我也有点晕了 ...

。。。我刚说完“i的值与i++(或++i)的值是两回事”
作者: 黑马黄武先    时间: 2014-8-6 01:15
Faith- 发表于 2014-8-6 00:16
++不是自增运算吗,0++不就是0+1吗

不是的,你缺少表达式了,这怎么能+1呢!!
作者: Faith-    时间: 2014-8-6 07:44
黑马黄武先 发表于 2014-8-6 01:15
不是的,你缺少表达式了,这怎么能+1呢!!

缺少什么表达式?? 这个程序有错误?
作者: Faith-    时间: 2014-8-6 07:56
fantacyleo 发表于 2014-8-6 00:36
我明白了,你糊涂的原因不是优先级,而是对++的误解。++有两种形式:
1. 前缀 如++i
2. 后缀 如i++

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


作者: xbz1986    时间: 2014-8-6 09:54
fantacyleo君的表述是多么清楚呀
作者: fantacyleo    时间: 2014-8-6 10:26
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
作者: dreamseekerkun    时间: 2014-8-6 11:09
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啊,脑子没转过弯来,和第一个有啥区别,求解答
作者: fantacyleo    时间: 2014-8-6 11:22
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
作者: dreamseekerkun    时间: 2014-8-6 11:33
fantacyleo 发表于 2014-8-6 11:22
还是没认真看我原话:

OK谢谢,加深理解了下又:hug:
作者: 200米王朝    时间: 2014-8-6 11:57
误人子弟来也

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

无标题.jpg

作者: Faith-    时间: 2014-8-6 12:29
fantacyleo 发表于 2014-8-6 11:22
还是没认真看我原话:

谢谢您  ok了
作者: 如果有梦    时间: 2014-8-6 13:12
++i是先自增1再赋值,i++ 是先赋值再自增1
作者: lspooooo    时间: 2014-8-6 13:17
学习一下
作者: 如果有梦    时间: 2014-8-6 13:18
i=(i++);会先把0赋值给i
作者: 黑马黄武先    时间: 2014-8-6 15:18
Faith- 发表于 2014-8-6 07:44
缺少什么表达式?? 这个程序有错误?

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

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

java.jpg

作者: 晋一峰    时间: 2014-8-6 15:25
只能说 这里的括号没有作用  没有起到让 i++ 优先运算的效果
作者: 黑马黄武先    时间: 2014-8-6 15:26
本帖最后由 黑马黄武先 于 2014-8-6 15:27 编辑

区别在于i++是i先不自加,在语句完后自加,++i先自加;就是这个意思了。搞了半天我也明白了,哈哈i=(++i);的结果是i=1,
i=(i++);的结果是i=0。

作者: 渴望学习    时间: 2014-8-7 11:18
路过~~~~~




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