黑马程序员技术交流社区

标题: 求理解算术运算符的++与--问题 [打印本页]

作者: 大漠孤星    时间: 2015-9-15 00:08
标题: 求理解算术运算符的++与--问题
下面程序执行的结果是?
int x =1,y=1;
if(x++==2 & ++y==2)
{
    x=7;
}
System.out.println("x="+x+"  , y="+y);
A.  x=1  y=2
B.  x=7  y=1
C.  x=7  y=2  
D.  x=2  y=2


作者: xiaoya0o0o    时间: 2015-9-15 00:08
结果为:x=2,y=2

&并且两边都为ture结果为true,括号内&两边都要进行判断,比如:假如x++==2为假时,还得继续判断右边的++y==2
&&并且两边都为ture结果为ture,当&&的左边为假时就不用判断右边的了,直接为假
比如:假设x++==2为假时就不必判断右边的++y==2了

&&、||和&、|的区别:
        1.逻辑&&和||具有短路行为,一旦确定整个表达式的结果,那么将不再执行剩余表达式;

++和--
如果表达式中,只做++或-- 一件事情,那么前++/--和后++/--效果一样的;
        但如果表达式中做多件事情:
                前++/--:先自增/自减,然后再参与表达式的其它运算;
                后++/--:先参与表达式的运算,然后在自增/自减;
比如该题:在 if(x++==2 & ++y==2)中x++=2先是参与了 if 语句的判断再把x赋值为2了
而 ++y==是先将y赋值为2再参与了if 语句的判断

作者: LYfeeling    时间: 2015-9-15 01:00
x++值是1,++y值是2,不执行x=7,之后xy全部自己一次
作者: Adualtbird    时间: 2015-9-15 07:54
++ --都是一元运算符,也就是赋值符号,++在前,表示先自增,再赋值,++在后,表示先赋值再自增
作者: heshiwei    时间: 2015-9-15 10:42
选 D.  x=2  y=2

分析:
  1. & 是"按位与"的意思,也就是左右两边的操作数装换为二进制,进行与运算后得出的结果。
  2. x++是判断后运算,++y 是先运算,后判断。不论++x还是x++, 执行完后,x都加1

也就是说,程序执行到if,先看"x++==2", 发现++在x后面,则先判断x==2?(x是1,自然不成立),那么这个表达式为false。接着遇到&,&是一个运算符,必须知道另一个操作数才能得出结果,所以接着去求"++y==2",
发现++在前,则先将y增加1(此时y=2,表达式成立),"++y==2"的结果true.

那么,综上所述:
false & true ==> 0 & 1 ==> 最终结果为
if ( false ){

}

自然,x=7,不执行,而x,y都增加了1,所以答案为x=2,y=2
作者: 夸克    时间: 2015-9-15 12:02
这个题主要考了两点:两种自增运算的区别和两种(逻辑与)的区别。弄明白这两点无论题目怎么变化,都能应对。
1.自增分++a和a++两种形式:a++是要让a先参与别的运算再自增,而++a要先自增再参与别的运。比如题目里
  x++==2,这句要在x本来值(是1的状态)下先判断x==2是否正确,判断完x才会自增1变成2;而如果是++x==2  那么就是x先自增1变成2,再进行x==2的判断。
2.对于&&和&,区别就是&&可以做为短路操作,当&&左边为假时,整条语句结果已经出来了为假,就不会读到&&右边的语句;如果是&,不管左边结果,右边的语句都会读到。
现在你在看题目就很清楚了
作者: youyuxiaoyu    时间: 2015-9-15 18:25
结果是D。因为当++或--在变量后面时先做其他运算在做++或--运算。x=1,x++==2中x先与2比较再+1,所以为false,if语句内的内容就为假。此时x++后等于2。y也++一次=2,。结果为D
作者: 15173139267    时间: 2015-9-15 19:56
我直接用白话给你讲述:    x++用法就是先使用然后再自增,所以if条件中x=1;++y用法先自增然后再使用,所以if条件中y=2,&运算符需要判断条件中两者都为真<true>,而且无论左边条件为真假,右边++y都必须执行.所以,x=1不符合条件,所以不进if条件语句中.程序继续往下面执行。当x使用后的下一刻,x=2,而且y=2.

  不知道这算不算白话。  越写越不像白话.
    做这样的题目,还要理解下 &&符号.
   &&也是用来判断条件中两者都为true,才进入if条件语句中。
   唯一的区别:只要&&符号左边的条件为假<false>,那么&&符号右边的条件就不用去判断,不用去执行,直接跳出当前if条件.但是左边条件为真<true>时,右边的条件就会进行判断.
   例子<用你的程序>:  
   if(x++=2 && ++y=2){}    System.out.println("x:"+x+"y"+y);   结果是:   x=2   ,  y=1

作者: lizhichao    时间: 2015-9-15 20:50
答案是C。 首先XY均为1然后xy都自增1.由于if判断满足。所以X=7Y=2
作者: lizhichao    时间: 2015-9-15 20:51
lizhichao 发表于 2015-9-15 20:50
答案是C。 首先XY均为1然后xy都自增1.由于if判断满足。所以X=7Y=2

简单到了。 没有朋友。建议多喝六个核桃补补脑
作者: 洛邑王澈    时间: 2015-9-16 21:04
D.  x=2  y=2毕老师视频里举得例子很形象说明问题
作者: shike951128    时间: 2015-9-17 17:51
其实像这样的计算,要注意运算符的优先级。这里需要知道的是,C语言的运算符优先级和java的运算符优先级并不完全一样。
作者: hepann    时间: 2015-9-26 19:03
解释的挺详细




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