黑马程序员技术交流社区

标题: 关于a++问题,求解释 [打印本页]

作者: 18353666072    时间: 2014-6-6 23:11
标题: 关于a++问题,求解释
如下,打印a的值为什么是11 而不是12
  1. public void test(){
  2.     int a = 10;
  3.     if( a > 0 ||  (a++) )
  4.          ++a;
  5.     System.out.println(a);
  6. }
复制代码


求大神解释,谢谢{:3_64:}
作者: 小草君    时间: 2014-6-6 23:16
本帖最后由 小草君 于 2014-6-6 23:17 编辑

这是短路或,前面a>o了就为真了,短路或遇见真就为真了,不执行后面了,后面a++就不判断了且也不执行了,直接执行下面的++a,10+1=11,所以打印的是11
作者: 夏季熬成了秋    时间: 2014-6-7 00:30
||  短路或,正因为是短路,是因为执行a > 0 以后结果为真不再执行之后的内容.
作者: 热血青年    时间: 2014-6-7 00:49
++玩之后再打印
作者: 我为你着迷    时间: 2014-6-7 07:12
首先呢  你要知道双或(||)的用法,它代表着左边为真的时候右边不运算,当左边为假时右边运算。而你的程序a>10满足条件那么右边不运算。这时执行到下边++a,给a进行加1的运算,并把加1操作后的结果重新赋给了a,所以打印的结果是11.楼主可以好好看视频里边的算数运算符这一块,毕老师讲的很详细的。
作者: 姿_`态    时间: 2014-6-7 07:57
||的用法:它代表短路或,和|是有区别的,那什么是短路或呐,就是当他的左边判断为真的时候,这个表达式的结果就是真了,右边就不需要判断了,因而就像短路了一样,所以说他是短路或,而对于| ,无论左边是否为真,右边都必须要判断。
相应的&&和&的区别,也是一样,一个是当左边为false,只需要判断左边,就知道为假,右边是不需要判断的,另一个是无论左边真假,右边都需要判断。

下面的程序希望能帮助你理解:
class TestDemo
{
        public static void main(String[] args)
        {

      /*
      int a = 10;
      if( a > 0 | a++>10)
         ++a;
      System.out.println(a);//结果是12
     */


    int a = 10;
    if( a > 0 ||  (a++) )
         ++a;
    System.out.println(a);//结果是11
        }
}


作者: sheng6699    时间: 2014-6-7 23:16
哥们,你这样  || a++写语法错误了。
作者: 四顾行者    时间: 2014-6-7 23:29
a>0或a++的条件下,a>0成立,所以直接跳转至下面的执行语句,a+1
作者: GoodBoy123    时间: 2014-6-7 23:54
如同楼上各位所说,就是| 和||的区别,
作者: \(^o^)/    时间: 2014-6-8 01:30
因为你用的是双或,就是短路或,只要两个表达式中有一个为TRUE,就为TRUE,使用双或的时候你左边为真了,然后右边不会执行,直接执行++a,所以是11,如果你用单或结果就是12.不知道楼主明不明白
作者: 杨胜男    时间: 2014-6-8 09:29
||运算,只要左边为真,右边是不参与运算的,也就是说a > 0 ||  (a++)的右边(a++)并不执行,a值自增一次,
作者: 18353666072    时间: 2014-6-8 12:33
杨胜男 发表于 2014-6-8 09:29
||运算,只要左边为真,右边是不参与运算的,也就是说a > 0 ||  (a++)的右边(a++)并不执行,a值自增一次, ...

嗷嗷{:3_52:}
作者: 18353666072    时间: 2014-6-8 12:34
\(^o^)/ 发表于 2014-6-8 01:30
因为你用的是双或,就是短路或,只要两个表达式中有一个为TRUE,就为TRUE,使用双或的时候你左边为真了,然 ...

明白了{:3_59:}
作者: iWilliam    时间: 2014-6-8 12:45
首先,
if( a > 0 ||  (a++) )
就无法通过编译

其次,我大概明白你是想问的这个||,为了区分|,我们来举个例子
A|B
意思是A或者B为true,A与B都要分别判断一下
A||B
意思也是A或者B为true,但是如果A为true,整个表达式就为true了,B就没有必要再判断了,
因此,通常用||,可以提高代码性能
作者: 倪大大    时间: 2014-6-8 13:58
|| 是逻辑或符号, 先判断左边是否为真,如果为真 这不再判断右边,为假再判断右边
右边的a++ 是没有执行的
作者: cain    时间: 2014-6-8 14:03
学习了啊
作者: sam9204    时间: 2014-6-8 14:57
短路了,判断到a>0为true就不会再去执行或判断 || 后面的语句
作者: 七弦    时间: 2014-6-8 15:04
楼上已经说完了
作者: 郝培慧    时间: 2014-6-8 15:27
因为a>0就已经满足条件 a++ 先加后赋值,所以打印的值是11了
作者: 小强9090    时间: 2014-6-8 15:36
短路与!!!
作者: 496080891    时间: 2014-6-8 15:38
||或符号,其中一个条件为真就执行循环中的语句++a,所以打印11
作者: 小生    时间: 2014-6-8 17:15
||是有短路的特点的,a>0这个条件满足后就不管后面的条件,也就是说a++是执行不到的代码。
作者: 零度冰    时间: 2014-6-30 18:52
原来如此
作者: hm521824    时间: 2014-6-30 19:25
楼上的正解,都很给力啊。




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