黑马程序员技术交流社区

标题: 关于++ [打印本页]

作者: 贾振凯    时间: 2013-3-25 19:15
标题: 关于++
本帖最后由 贾振凯 于 2013-3-25 21:55 编辑

int j,i=3;
j=(i++);
经过这样的运算以后j还是3,
感觉应该是4才对啊???????
作者: 刘海东    时间: 2013-3-25 19:26
++在后面是先进行赋值运算,在进行自增运算,++前面才是先进行自增运算,再进行赋值运算的。
作者: 刘文超    时间: 2013-3-25 19:32
lz括号加不加应该都是一样的、lz请看i++:
  1. int j,i=3;
  2. j=i++;
复制代码
上面代码等同于:
  1. int j,i=3;
  2. j=i;
  3. i=i+1;
复制代码
顺便说说++i:
j=++i;代码等同于:
  1. i=i+1;
  2. j=i;
复制代码

作者: lxww    时间: 2013-3-25 19:43
++i是先自增运算再赋值,i++是先赋值再进行自增运算。
作者: 陆旭东    时间: 2013-3-25 19:45
j=i++;是先将i的值赋给j然后i再+1
j=++i;是i先+1然后赋值给j
在这里括号加不加都是无所谓的,因为++的优先级比=高所以加了括号还是一样。
作者: 狱之一族    时间: 2013-3-25 19:50
int j,i=3;
j=i++;//当++在后面的时候是先赋值后相加,也就等于j=i; i++;
      //而当++在前面时事先运算然后在赋值,也就等于i++; j=i;
作者: 罗平    时间: 2013-3-25 20:37

int j,i=3;
j=(i++);

这个是这样:
你首先得明白++i 和 i++的区别
i++  首先是将i的值赋j  ,让后i加一个1变成2 ,j=3,i=2
假如是这样  j=++i  这下j就是4,因为先将i加1,那么等号后面的式子就为4,再赋给j 这下j就是你认为的4.
作者: 疯狂程序    时间: 2013-3-25 20:45
第一你要看看优先级
第二 j = i++ 先赋值在运算
       j = ++i 先自增再运算

作者: 贾文泽    时间: 2013-3-25 20:55
刘海东 发表于 2013-3-25 19:26
++在后面是先进行赋值运算,在进行自增运算,++前面才是先进行自增运算,再进行赋值运算的。 ...

++在后面先赋值再运算?

那如果 a=1; a=a++ ;这时候 a 的值是多少呢?
暂且理解先赋值再运算 ,先赋值 a = a 也就是 a = 1,再运算 a=a+1 ????是这样么?
作者: 刘海东    时间: 2013-3-25 21:00
贾文泽 发表于 2013-3-25 20:55
++在后面先赋值再运算?

那如果 a=1; a=a++ ;这时候 a 的值是多少呢?

先赋值a=a,这个时候a还是1。赋值完了之后,a自增,a变成了2。下次使用a的时候a就是2 了。
作者: 贾文泽    时间: 2013-3-25 21:05
关于自增自减的问题,你始终明确一点,你想要的是  i++ 或者 ++i 这个表达式的值,还是 i 这个变量的值?

i=1;  i++   //   i++ 这个表达式的值是 i 自增之前的值,也就是1, i 这个变量的值是自增后的值 ,也就是2
i=1; ++ i   //   ++i 这个表达式的值是 i 自增之后的值,也就是2, i 这个变量的值是自增后的值 ,也就是2

对于自减也是一个道理

比如说你的代码:
int j,i=3;
j=(i++);     //这里明显是需要 i++ 这个表达式的值,那 j 肯定等于 3
作者: 贾文泽    时间: 2013-3-25 21:08
刘海东 发表于 2013-3-25 21:00
先赋值a=a,这个时候a还是1。赋值完了之后,a自增,a变成了2。下次使用a的时候a就是2 了。 ...

你确定以及肯定?
要不你运行下试试看是多少?

哎,看都不用看,a还是1,多多理解。
作者: 刘海东    时间: 2013-3-25 21:18
贾文泽 发表于 2013-3-25 21:08
你确定以及肯定?
要不你运行下试试看是多少?

也就是说,
int i=1;
i++;//这个语句里面i始终是1,下一个语句开始 i 就是2了。


int i=1;
++i;//这个语句里面 i 就已经是2了。
作者: 贾文泽    时间: 2013-3-25 21:22
刘海东 发表于 2013-3-25 21:18
也就是说,
int i=1;
i++;//这个语句里面i始终是1,下一个语句开始 i 就是2了。

还没明白? 看我11楼的解释

两种情况下,i 的值都会+1.
但是,++i 跟 i++ 这两个表达式的值是不一样的

i = i++; 这里需要的是把 i++ 这个表达式的值赋给 i ,又不需要 i
作者: 刘海东    时间: 2013-3-25 21:27
贾文泽 发表于 2013-3-25 21:22
还没明白? 看我11楼的解释

两种情况下,i 的值都会+1.

我明白了,我试试用代码验证一下。赋的是表达式
作者: 黄诗宾    时间: 2013-3-25 21:32
虽然"()"是优先级别最高的运算符,但控制不了"++"和"--";
这是sun公司定义的,死规定,没有为什么。

int j,i=3;
j=(i++);  
这里的括号其实是没有作用的,直接将i的值赋予j了然后打印了。
如果是++i,则值为4.

作者: 贾振凯    时间: 2013-3-25 21:50
贾文泽 发表于 2013-3-25 20:55
++在后面先赋值再运算?

那如果 a=1; a=a++ ;这时候 a 的值是多少呢?

a=1;
a=a++;
这个用反编译会看到:

常量1压栈
常量1出栈并赋值给变量a
再将a的值压栈(注意:这时候a值还是1)
变量a加1(这时候a就等于2啦)
之前进栈那个1出栈并再次赋值给a(a这个悲催的孩子又变成1啦)

看下面这段代码
int j=1;
for(int i=0;i<100;i++){
          j=j++;
}
System.out.println(j);//这时候j=1!!!!!!!!!!!!!!!
作者: 贾文泽    时间: 2013-3-25 21:52
贾振凯 发表于 2013-3-25 21:50
a=1;
a=a++;
这个用反编译会看到:

循环中是把 j++ 这个表达式的值赋给 j
所以,不管循环多少次,j 必须还是 1

作者: 贾振凯    时间: 2013-3-25 21:53
黄诗宾 发表于 2013-3-25 21:32
虽然"()"是优先级别最高的运算符,但控制不了"++"和"--";
这是sun公司定义的,死规定,没有为什么。

石松老师的原话啊呵呵!!!!!!!!11
作者: 黄诗宾    时间: 2013-3-25 22:03
贾振凯 发表于 2013-3-25 21:53
石松老师的原话啊呵呵!!!!!!!!11

你是我们班的么?
作者: 贾振凯    时间: 2013-3-25 22:52
嗯,我们班我就对你名字熟悉点儿,,因为这个论坛
作者: 袁梦希    时间: 2013-3-25 23:47
其实大家楼主的意思我能明白,只是大家回答不能给楼主予以理解。

楼主的意思是(i++)明明放了括号,怎么能不自加呢,根据优先级来说确实应该先算括号里的,编译器也确实先算的括号里的,
因为i++本身的属性就是先让其运算后再自加。所以加不加括号无所谓的事,我给你举个例子,你看看是不是加不加括号都无所谓。
  1. public static void main(String[] args) {

  2.                 int j, i = 3;
  3.         //        j = (i+++1);
  4.                                 j = i+++1;
  5.                 System.out.println("i=" + i + ",j=" + j);
复制代码
运行结果 i=4,j=4





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