A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
        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,怎么可能会走到这一步呢?按这个条件应该是没办法进去的吧,可运行结果又是可以进去的,我哪里忽略了什么?

最佳答案

查看完整内容

if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值 当第一个字节为负整数成立并且此时!blns为真,条件表达式的结果为真,语句执行. blns = true; 将blns的值改为ture.第二个字节判断的时候,!blns为假此时条件表达式的结果肯定为假,进入else执行. } else { num++; ...

8 个回复

倒序浏览
本帖最后由 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的值在条件语句体执行后发生了相应的变化.不知道你看懂了么?
回复 使用道具 举报
我没看明白这段代码  但是我知道可以执行到 那时因为 blns的初始值是假 然后变为真  再然后变为假
回复 使用道具 举报
因为一个汉字是两个字节,并且都是以-开头的。 "HM程序员a"实际对应的byte[]为[72, 77, -77, -52, -48, -14, -44, -79, 97],希望你能明白
回复 使用道具 举报
if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值   
当第一个字节为负整数成立并且此时!blns为真,条件表达式的结果为真,语句执行.
                                blns = true;      
将blns的值改为ture.第二个字节判断的时候,!blns为假此时条件表达式的结果肯定为假,进入else执行.
                        } else {
                                num++;
                                blns = false;
执行num++,将false又重新赋值为false
                        }
回复 使用道具 举报
啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦
回复 使用道具 举报
学习?????????????????
回复 使用道具 举报
z332406259 发表于 2016-4-12 09:56
if (bys < 0 && !blns) { // 判断:中文字符转换了字节后 是为负整数的 && 取blns的相反值   
当第一个 ...

讲得很好,是我头脑进入死循环了,以为要false的结果才能进入下一步,原来true就可以执行了
回复 使用道具 举报
进来学习下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马