黑马程序员技术交流社区

标题: If括号中竟然是赋值语句,求解释 [打印本页]

作者: osully    时间: 2014-3-2 11:41
标题: If括号中竟然是赋值语句,求解释
今天复习时 发现以下问 if判断 括号里面竟然是赋值!!!
感觉不科学啊!!求解释,谢谢啊!
运行结果是c ,false
  1. public class Test1
  2. {
  3.         public static void main(String[] args) {
  4.                 boolean b = true;
  5.                 if(b=false)     //这里!!!!!
  6.                         System.out.println("a");
  7.                 else if(b)
  8.                         System.out.println("b");
  9.                 else if(!b)
  10.                         System.out.println("c");
  11.                 else
  12.                         System.out.println("d");
  13.                
  14.                 System.out.println(b);
  15.         }
  16. }
复制代码



作者: yunzhongzhuhuo    时间: 2014-3-2 12:00
  1. public class Test1
  2. {
  3.         public static void main(String[] args) {
  4.                 boolean b = true;
  5.                 if(b=false)
复制代码



作者: yunzhongzhuhuo    时间: 2014-3-2 12:01
上面的没有都复制过来,重新给你弄一个啊

  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                
  5.                 boolean b = true;
  6.         if(b=false)     
  7.                 /*上面的if(b=false)
  8.                 相当于先为b赋值:b=false
  9.                 然后if(b)
  10.                 所以遇到!b就是真了,就执行else if(!b)里面的代码了
  11.                
  12.                
  13.                 不知道你清楚不清楚!!!
  14.                 */
  15.                 System.out.println("a");
  16.         else if(b)
  17.                 System.out.println("b");
  18.         else if(!b)
  19.                 System.out.println("c");
  20.         else
  21.                 System.out.println("d");
  22.         
  23.         System.out.println(b);
  24.         }
  25. }
复制代码

作者: osully    时间: 2014-3-2 12:20
yunzhongzhuhuo 发表于 2014-3-2 12:01
上面的没有都复制过来,重新给你弄一个啊

我的意思是 if() 括号内为什么可以写赋值语句!
理论上 不是应该是b==false 吗???
作者: 洋葱骑士    时间: 2014-3-2 12:41
本帖最后由 洋葱骑士 于 2014-3-2 12:43 编辑
osully 发表于 2014-3-2 12:20
我的意思是 if() 括号内为什么可以写赋值语句!
理论上 不是应该是b==false 吗??? ...

http://blog.csdn.net/paincupid/article/details/7463838
在if()内的判断语句少写一个"="时,仍然能被执行。括号内执行赋值语句。  但判断条件不成立,会执行else语句。当if()内的赋值语句为非boolean型时,会因为返回值不为boolean型编译不通过

作者: 李白衣    时间: 2014-3-2 12:49
if()里面是可以写赋值语句的,是因为,(b=flase)的这个表达式值就是false,是可以进行判断的。
写表达式不是boolean类型的值,就不能通过。
作者: 曾振华    时间: 2014-3-2 12:55
if后面的括号里只要是个条件表达式就可以,虽然有赋值,但仍然要判断b是true还是false.

所以程序执行到(!b)的时候打印一次c,最后打印b的时候,这个时候b已经被if后面的条件语句赋值为false了。
作者: ixiangfeng    时间: 2014-3-2 13:32
b = false 是一个表达式来的 这个表达式的结果是false  相当于在里面做了两件事 1.先给b赋值 2.将if语句的条件设置为false  这个完全没问题啊 一般的书上也写的是  if(表达式){执行体}
作者: yunzhongzhuhuo    时间: 2014-3-2 14:04
洋葱骑士 发表于 2014-3-2 12:41
http://blog.csdn.net/paincupid/article/details/7463838
在if()内的判断语句少写一个"="时,仍然能被执 ...

其是,可以赋值,也可以判断,但是要看情况了,if里面必须是boolean型的条件,你的刚好是boolean型的,所以两种都可以了
如果是其它类型,比如int型,你这样写{int a=1 if(a=2)}就是错的了
作者: 洋葱骑士    时间: 2014-3-2 15:08
yunzhongzhuhuo 发表于 2014-3-2 14:04
其是,可以赋值,也可以判断,但是要看情况了,if里面必须是boolean型的条件,你的刚好是boolean型的,所 ...

你说的话和我回的有区别吗????
作者: hdsjsql    时间: 2014-3-2 16:20
if语句后面的括号中的语句只要返回boolean值就可以,
赋值语句返回左值,b = false,返回b的值,就是false;
作者: l939    时间: 2014-3-2 21:18
楼主,If是判断型语句,在判断相等时得用 ==:if(b == false)
==:是判断   而 = 则是赋值
if(b=false)//这是将b赋值变成了false;
变成了一个赋值动作,于是跳到下面else if(b)//而if...else if 是个整体,所以它里面的b都是未赋值前的true;
所以else(b)不满足;然后跳到了else(!b)//此时b的值是false.所以符合,打印了一次c,然后判断结束,打印了一次b..
所以结果是:c , false...
作者: 位俊鹏    时间: 2014-3-2 22:17
这个是可以的
因为首先定义了一个boolean型的变量.变量是可以变化的.之后的if(b=false)   就是把b变成false了.
之后的就是如果是false就输出"a".
但这个不能和==搞混了,=和==是完全不同的.之前我对着也很迷糊.




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