黑马程序员技术交流社区

标题: 小弟基础题遇到疑惑,求懂的解释下 [打印本页]

作者: 旺仔小石头    时间: 2015-12-29 23:34
标题: 小弟基础题遇到疑惑,求懂的解释下
首先先看题目,具体如下:

下面程序执行的结果是?( )
boolean b=true;
if(b=false)
{
        System.out.println("a");
}
else if(b)
{
        System.out.println("b");       
}
else if(!b)
{
        System.out.println("c");
}
else
{
        System.out.println("d");
}
A.        a   
B.        b  
C.        c
D.        d
答案是c.  
我的疑点在选项A中  ,我的理解是if后面这个挨着的小括号里应该是条件语句,而且只可能有true或false种情况,
而b=false只是一个赋值语句,   那为何在此处编译通过???  难道赋完值后又单独再次判断b的值???   不知道为何,我同学说的我理解不过去,  求懂的帮忙解答下,不胜感激

作者: 旺仔小石头    时间: 2015-12-29 23:36
写错了......................
我的疑点在选项if中,即  if (b = false)  ,我的理解是if后面这个挨着的小括号里应该是条件语句,而且只可能有true或false种情况,
而b=false只是一个赋值语句,   那为何在此处编译通过???  难道赋完值后又单独再次判断b的值???   不知道为何,我同学说的我理解不过去,  求懂的帮忙解答下,不胜感激
作者: 旺仔小石头    时间: 2015-12-29 23:46
怎么弄悬赏技术分?指导下

作者: 李永佳    时间: 2015-12-30 15:40
因为b=false,b是boolean型的,所以这句话也有返回值,是false。如果换成int x = 14这样的语句,是不行的。变量赋值也有返回值
作者: 旺仔小石头    时间: 2015-12-30 16:59
李永佳 发表于 2015-12-30 15:40
因为b=false,b是boolean型的,所以这句话也有返回值,是false。如果换成int x = 14这样的语句,是不行的。 ...

为什么这个赋值语句会有返回值?   (b=false)==false吗
作者: 337325635    时间: 2015-12-30 21:46
又学到了
作者: 迷茫不堪的年纪    时间: 2015-12-30 23:10
其实就是 B C 徘徊而已,B不成立的原因在于他本身就是假的下面肯定不执行, !false 就是真了 比较简单, if 一旦有结果之后的不执行D 排除,  所以C  soeasy
作者: 马赛    时间: 2015-12-31 00:01
应该是在第一个判断语句的时候,把b的值改成了false,判断语句里是false不会执行大括号里边的,!b现在是true,所以执行c,else里边的自然也就不执行了.我是根据结果推的原因,应该是这样把
作者: Clouddd    时间: 2015-12-31 09:25
这个问题楼上已经把要点说出来了,根原因是这句话if(b=false)。由于b本来就是个Boolean类型,那b它自己本身就是个判断条件,所以在b=false这个过程中,你把false赋值给b,所以在if中就是if(false),因此这个if..else.if只会进入到System.out.println("c");
另外,在if()括号中的是只能是true或者false,像直接的赋值语句是不行的,比如int x = 1, 因为这个赋值语句没有任何Boolean类型的返回值, 如果是if((int x = 1) == 1)这样的话就可以了。这个问题在你以后很容易就可以弄懂的啦,目前只要记住if()这个括号中必须是boolean值就可以,无论它里面是怎么实现的。
作者: 李永佳    时间: 2015-12-31 10:33
旺仔小石头 发表于 2015-12-30 16:59
为什么这个赋值语句会有返回值?   (b=false)==false吗

对呀,我也是在别的论坛里看到的,给b=false赋值,返回值就是false,给int a = 10赋值,返回值就是10.我是这样理解的
作者: Hi刘腾    时间: 2015-12-31 12:36
楼主的意思:
1.if后面这个挨着的小括号里应该是条件语句,而且只可能有true或false种情况
2.if (b = false) 中b=false只是一个赋值语句,   那为何在此处编译通过

第一、if (b = false),是这样的:
1.先将 false的值赋给b,此时的b就成了false
2.然后 if(b),其实就是if(false)

第二、关于"="赋值运算符
1.表示把右边的值赋给左边
2.b=false,由于b是boolean类型的,false也是boolean类型的,所以赋值会成功,而且是if要的boolean类型,
所以,编译会成功。

第三、if()括号中要的是一个boolean值,不局限于形式,只要最后的结果:
1:可以是这样boolean b = true;
     if(b){}  或者  if(!b){}
2:可以是这样的 int a = 2, b = 3;
   if(a==b){}

最后,如果楼主还是不太理解的话,我建议你输出一下,看看结果到底的是什么,你也可以把你所有困惑的运算都输出一下,看看运算结果
boolean b = true;
System.out.println(b = false);
作者: 愿爱无忧    时间: 2015-12-31 13:34
挖坑不止
作者: Forwhat    时间: 2015-12-31 16:06
本帖最后由 Forwhat 于 2015-12-31 16:12 编辑

现在重点不是第一个if(b=false),而是这个IF本身为什么没有执行而输出a,反而输出的是C?返回值之类的有点太笼统了吧,具体返回的是什么有人查过么?我记得C语言的赋值语句返回值就是其本身,举个例子说就是"a=1",返回值就是1,布尔类型同上,java估计也是适用的吧,不然为什么第一个if(b=false){}中括号内的语句没有执行呢!
也就是说b=false本身这赋值语句返回值就是false,
综上这第一个if(b=false)语句可以等价于if(false),所以输出的不会是a!
后面的语句就简单了,因为b的值变为了false,所以“!b”就是"true",自然就会执行输出c了

作者: 旺仔小石头    时间: 2015-12-31 20:17
Hi刘腾 发表于 2015-12-31 12:36
楼主的意思:
1.if后面这个挨着的小括号里应该是条件语句,而且只可能有true或false种情况
2.if (b = false) ...

看来我只能这样理解了  谢了兄弟

捕获.PNG (10.02 KB, 下载次数: 32)

捕获.PNG

作者: 雨来    时间: 2015-12-31 20:26
b=false  这是一个赋值表达式吧  表达式运算后总会有个结果的;那么结果是什么呢? 当然是左边的变量了  其实运算后 再参与运算的话  用的是b变量的值  也就是false
作者: 旺仔小石头    时间: 2015-12-31 21:03
雨来 发表于 2015-12-31 20:26
b=false  这是一个赋值表达式吧  表达式运算后总会有个结果的;那么结果是什么呢? 当然是左边的变量了  其 ...

额  ,a = 5 ,这个表达式的结果是a吗
作者: 小五哥    时间: 2015-12-31 21:20
看不懂~
作者: 雨来    时间: 2016-1-1 08:49
旺仔小石头 发表于 2015-12-31 21:03
额  ,a = 5 ,这个表达式的结果是a吗

是的,我不知道你现在学到哪里了,你在输入语句里打印一个这个a=5 试一下看看结果是什么?

class FuResult {
        public static void main(String[] args) {
                int a;
                System.out.println(a=5);
        }
}
作者: 雨来    时间: 2016-1-1 08:53
没有返回值的,只有在函数里;如返回值类型是void 我们只所以用表达  是因为我们要取里的值参与运算;如果没有值的话,我们为什么要写表达式呢?就向我们做什么事情,都有目的性的;如你去吃饭说明你饿了,你去教师说明你要学习,一切都以使用为目的;面向对象就是这这样的有的时候你想不通一件事情的时候,向反的方向想一下你就会豁然开朗的。
作者: 旺仔小石头    时间: 2016-1-1 13:02
雨来 发表于 2016-1-1 08:53
没有返回值的,只有在函数里;如返回值类型是void 我们只所以用表达  是因为我们要取里的值参与运算;如果 ...

感谢兄弟认真的回复
作者: Hi刘腾    时间: 2016-1-1 22:10
旺仔小石头 发表于 2015-12-31 20:17
看来我只能这样理解了  谢了兄弟

你最好还是找找这方面的资料,把这个知识点弄懂,别带着疑问继续{:2_40:}
作者: chengz    时间: 2016-1-1 22:30
长见识了
作者: 1158147908    时间: 2016-1-2 00:03
是的呀,先把false赋值给b,然后就是判断if(b)了,可以在if语句的判断中赋值
作者: 雨来    时间: 2016-1-5 23:05
旺仔小石头 发表于 2015-12-31 21:03
额  ,a = 5 ,这个表达式的结果是a吗

是这样的,你可以放在输入 语句里试一下 输入 的结果是5
作者: StringBOX    时间: 2016-1-5 23:37
原来boolean还有这一出。。。。涨见识了。。。。




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