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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Cola 中级黑马   /  2014-2-23 07:14  /  2165 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Cola 于 2014-2-23 11:47 编辑

如题,下边的代码结果有差异,请问是什么原因呢?
  1. int x=1;
  2.                 x=(x++)%2;
  3.                 System.out.println("x="+x);//x=1
  4.                
  5.                 int y=1;
  6.                 y=(y+1)%2;
  7.                 System.out.println("y="+y);//y=0
复制代码



评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

7 个回复

倒序浏览
x++先运算,后加1,x+1,类似于++x,先加1,再运算
(x++)%2,先运算x%2,x再加一,所以余数是1
(x+1)%2,先运算x+1,再运算%2,所以余数是0

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
薆情媬証書 来自手机 中级黑马 2014-2-23 08:57:53
藤椅
楼上说的对,这牵扯运算先后的问题!x++是先付值后参与运算,而x+1相当于++x先加一在参与运算!比如y=x++,那么运算结果就是,y=x.  x=x+1

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
先加后加问题。举个例子:y=x++;相当于这两句话:y=x;x=x+1。y=++x;相当于这两句话:x=x+1;y=x。
本例中int x=1; x=(x++)%2;相当于这几句话:(定义一个中间变量temp)int x=1;temp=x%2;x=x+1;x=temp;所以最终x的值是1。楼上说的都不细,但是都是对的。楼主估计最搞不懂的就是x=(x++)%2;这句话,我把它分解了,希望明白。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
int x=1;
                x=(x++)%2;
                System.out.println("x="+x);//x=1
               
                int y=1;
                y=(y+1)%2;
                System.out.println("y="+y);//y=0
这里: x=(x++)%2; //(x++)%2的x处和2取模的时候是1,取完模后才加1。即x++是先x=x,执行完这一步后,才x=x+1;
(y+1)%2;//这里去摸的时候y已经由1加1后变成2了。就是一般的y+1

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
我记得毕老师说过
short s=4;
s=s+1;  // 这个就报错
s++; //内部自动转换类型
++s;  //内部自动转换类型

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
前自增:++x
int x = 0,y=0;
x = ++y;
结果:x = 1,y=1;
前自增是自身先进行自增(加一),然后在参与赋值或是其他运算。

后自增:x++
int x = 0,y=0;
x =y++;
结果:x = 0,y=1;
后自增是先参与赋值或其他运算,运算完后自身再自增(加一)

也就是自增与参与其他运算的先后顺序,前自增是先自增再运算,后自增是先运算后自增

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
这个应该考虑到运算符的优先级问题,把你的问题分解开就好明白了:
class Operate_P
{
        public static void main(String[] args)
        {
                           int x=1,t;
                           t=x++;
                           System.out.println("t= "+t+"\tx="+x);//t=1 x=2
                           x=(t)%2;
                           System.out.println("t= "+t+"\tx="+x);//t=1 x=1

               int y=1,yy;
                           yy=y+1;
                           System.out.println("yy= "+yy+"\ty="+y);//yy=2 y=1
               y=(yy)%2;
               System.out.println("yy= "+yy+"\ty="+y);//yy=2 y=0
        }
}
                                                          运算符优先级表
优先级
运算符
结合性
1
() [] .
从左到右
2
! +(正) -(负) ~ ++ --
从右向左
3
* / %
从左向右
4
+(加) -(减)
从左向右
5
<< >> >>>
从左向右
6
< <= > >= instanceof
从左向右
7
== !=
从左向右
8
&(按位与)
从左向右
9
^
从左向右
10
|
从左向右
11
&&
从左向右
12
||
从左向右
13
?:
从右向左
14
= += -= *= /= %= &= |= ^= ~= <<= >>= >>>=
从右向左


  说明:

  1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。

  2、 结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4,则意义为3加-4,符号首先和运算符右侧的内容结合。

  3、 instanceof作用是判断对象是否为某个类或接口类型,后续有详细介绍。

  4、 注意区分正负号和加减号,以及按位与和逻辑与的区别

  其实在实际的程序编写中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马