黑马程序员技术交流社区

标题: 基础问题,求大虾指教 [打印本页]

作者: 小草君    时间: 2014-5-28 22:14
标题: 基础问题,求大虾指教
class IfTest{
        public static void main(String[] args){
                int x = 1,y = 1;
                if(x++==2 && ++y==2)
                {
                        x =7;
                }
                        System.out.println("x="+x+",y="+y);//打印的是x=2,y=1
                int z = 1;
                if(++z== 2){
                        System.out.println(z);//编译通过,打印的是z=2;
                }
                int s=1;
                if(s++==2)
                {       
                        System.out.println(s);//编译不通过
                }
        }
}
//那么这个s++==2的算法是怎么算的,和++z==2有什么区别?
作者: woshihq    时间: 2014-5-28 22:40
s++ 是先进行s的运算, 再自加一 ,而++z是先自加一,再运算。明白不??
作者: 成小龙    时间: 2014-5-28 22:41
执行到s++==2时,s是多少就是多少,执行完语句后s加一次1;执行++z==2时,s先自家一次1,在进行比较
作者: 张志民    时间: 2014-5-28 22:47
二楼说的很明白
作者: 黑马粉、峥    时间: 2014-5-28 22:48
s++==2,先运行 s==2,然后再++,先进行比较在自加
作者: love~陌    时间: 2014-5-28 22:51
那么这个s++==2的算法是怎么算的,和++z==2有什么区别

对于++z和z++的问题,你可以简单的这么认为(这是诀窍!):
谁在前谁先运算!

不比听别人怎么给你啰嗦的解答,记住这个诀窍即可。

s++==2的运算顺序是:
先判断s==2,然后s自增1,

++z==2的运算顺序是:
z先自增1,然后判断结果自增后的z==2

少侠,记住诀窍,万事不愁!

若是版主给我加了技术分,我再告诉你JDK里面的一个小BUG

作者: Alan_Kwan    时间: 2014-5-28 22:52
太基础了,楼上的都回答好了。。

顺便提一个点:没有编译不通过,是没有执行代码里面的打印语句。
作者: 13556793092    时间: 2014-5-28 23:16
  1. class IfTest{
  2.         public static void main(String[] args){
  3.                 int x = 1,y = 1;
复制代码

作者: wyy666    时间: 2014-5-28 23:24
很基础,需要自己先体会下,
作者: 13556793092    时间: 2014-5-28 23:26
主要切入要点:1.x++是先运算在自增;++x是先自增,在参与运算;
                        2.&&当两边条件都满足为true,当&&前语句为false,不再执行&&后面的语句
解析代码如下:

class IfTest{
        public static void main(String[] args){
                int x = 1,y = 1;
                /*1.判断x++==2 && ++y==2
                   2.先比较x==2,返回false,在自增x=2
                   3.由于&&前面条件失败,故不需要判断++y==2  即依旧y=1;
                   4.if语句条件不满足,继续执行程序,打印x=2,y=1;
                */
                if(x++==2 && ++y==2)
                {
                        x =7;
                }
                        System.out.println("x="+x+",y="+y)
                int z = 1;
                //原理同上
                if(++z== 2){
                        System.out.println(z);
                }
                int s=1;
                //原理同上
                if(s++==2)
                {        
                        System.out.println(s);
                }
        }
}
作者: 赵文豪    时间: 2014-5-28 23:36
先比较s++和++s的区别:s++先运算,后自加1.++s先自加1再做运算。理解他们之间的区别,就可很容易的区分
s++==2的算法和++z==2有区别(s++==2先判断s==2在自加1,而++z则是z先自加1,再判断是否等于2)
作者: yang1352546    时间: 2014-5-28 23:49
s++==2的运算顺序是:先判断s==2是否正确,然后s自增1,

++z==2的运算顺序是:z先自增1,然后判断结果自增后的z==2是否正确

总而言之 就是如果++在前就先自增在判断,如果++在后先判断在自增
作者: nxp1986    时间: 2014-5-28 23:54
确实是非常的基础,楼主说的不是 编译不成功,而是没有运行结果
作者: Aron    时间: 2014-5-29 00:02
大家都讲的好清楚 我就不发话了 路过。。
作者: love~陌    时间: 2014-5-31 11:38
既然技术分,那我就继续说吧。
作者: love~陌    时间: 2014-5-31 11:41
官方文件说当++遇到小括号,小括号运算优先级高于++,所以遇到类似于s=(i++),按照官网说法,应该是i++运算完再赋值给s,你实际运行,小括号形同虚设,有跟没有结果都是一样的。少侠,老夫只能说到这里
作者: heima_xyu    时间: 2014-5-31 11:59
二楼说说的JDK的BUG是什么,急切想知道:handshake
作者: yinxjfly    时间: 2014-5-31 12:11
大伙都会打的很专业的!

作者: Blüe-wǒlf    时间: 2014-5-31 13:18
哈哈,简单的小问题。
作者: Mr.高    时间: 2014-5-31 13:26
这个会了已经。。。
作者: fenzheng    时间: 2014-5-31 13:32
i++是使用了i的值之后再将i的值加1 ++i是在使用i的值之前就将i的值加1  这样可以理解吗?
作者: blz01003hm    时间: 2014-5-31 14:55
love~陌 发表于 2014-5-31 11:41
官方文件说当++遇到小括号,小括号运算优先级高于++,所以遇到类似于s=(i++),按照官网说法,应该是i++运算 ...

貌似不算BUG,s=(i++) 是整体,先要把语句执行完了 i才++;
作者: 倪大大    时间: 2014-5-31 15:41
额 就是一个先引用后加1  和先加1后引用,  2楼说的很清楚了
作者: 406957151@qq.co    时间: 2014-5-31 16:00
13556793092 发表于 2014-5-28 23:26
主要切入要点:1.x++是先运算在自增;++x是先自增,在参与运算;
                        2.&&当两边条件都满足为true,当&&前语 ...

这个解释最清楚 真厉害




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