黑马程序员技术交流社区

标题: 一个循环的基础问题没看明白 请教大侠们 [打印本页]

作者: 落星追恒    时间: 2016-4-12 09:56
标题: 一个循环的基础问题没看明白 请教大侠们
        String str = "HM程序员a";
                byte[] bys = str.getBytes("GBK");
                int num = 0;
                boolean blns = false; // 初始值 相当于阀门 决定了num的值
                for (int i = 0; i < 4; i++) {
                        if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值
                                blns = true;
                        } else {
                                num++;
                                blns = false;
                        }
                }
                System.out.println(num);

我的问题是
        if (bys < 0 && !blns) 这个为什么可以成立,!blns的值不是一直都是false吗,那!blns就是true,怎么可能会走到这一步呢?按这个条件应该是没办法进去的吧,可运行结果又是可以进去的,我哪里忽略了什么?


作者: z332406259    时间: 2016-4-12 09:56
本帖最后由 z332406259 于 2016-4-12 13:41 编辑

   if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值   
当第一个字节为负整数成立并且此时!blns为真,条件表达式的结果为真,语句执行.
                                blns = true;      
将blns的值改为ture.第二个字节判断的时候,!blns为假此时条件表达式的结果肯定为假,进入else执行.
                        } else {
                                num++;
                                blns = false;
执行num++,将false又重新赋值为false
                        }
所该循环能够一直进行的原因就是blns的值在条件语句体执行后发生了相应的变化.不知道你看懂了么?

作者: 菊花爆满山    时间: 2016-4-12 16:55
我没看明白这段代码  但是我知道可以执行到 那时因为 blns的初始值是假 然后变为真  再然后变为假
作者: 15614014298    时间: 2016-4-12 20:23
因为一个汉字是两个字节,并且都是以-开头的。 "HM程序员a"实际对应的byte[]为[72, 77, -77, -52, -48, -14, -44, -79, 97],希望你能明白
作者: 大熊猫丶    时间: 2016-4-12 23:02
if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值   
当第一个字节为负整数成立并且此时!blns为真,条件表达式的结果为真,语句执行.
                                blns = true;      
将blns的值改为ture.第二个字节判断的时候,!blns为假此时条件表达式的结果肯定为假,进入else执行.
                        } else {
                                num++;
                                blns = false;
执行num++,将false又重新赋值为false
                        }
作者: Max灬xu    时间: 2016-4-13 00:33
啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦
作者: LiuLiu006    时间: 2016-4-13 22:15
学习?????????????????

作者: 落星追恒    时间: 2016-4-13 22:51
z332406259 发表于 2016-4-12 09:56
if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值   
当第一个 ...

讲得很好,是我头脑进入死循环了,以为要false的结果才能进入下一步,原来true就可以执行了
作者: 小红花    时间: 2016-4-29 12:38
进来学习下




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