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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 zhangfeng 于 2012-6-23 09:48 编辑

定义了一个FileReader类的实例 fr。
如果fr.read()读到了文件最后,会返回一个-1,就表示读到了文件最后了。
但是这个代码里while((ch = fr.read()) != -1)
用while循环里那段代码表示读到文件末尾,这个代码为什么不是表示:如果fr.read()能赋值给ch为真,不能为假呢。
我这里想不明白。
int func(){
        return -1;
}

void main() {

        int ch ;
        while((ch = func()) != -1) {
                printf("aaa");
        }
        getch();
      
}
看我写的这个代码,在c或者c++的编译器里,这个while循环是不执行的。
因为和-1作比较的是表达式,不是ch那个变量。
想要这个while执行,改成while((ch = func()) != 1),因为(ch = func())赋值成功,返回了true,然后这个true和-1比较。
可以在java里就不是这样了,为什么ch会去和-1做比较呢?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 新手鼓励一下!

查看全部评分

5 个回复

倒序浏览
while((ch = fr.read()) != -1)  
这个代码为什么不是表示:如果fr.read()能赋值给ch为真,不能为假呢。

fr.read();不管读到的是不是-1,都能给ch赋值

这句话是先把读到的值赋给ch,如果ch不等于-1,循环执行。如果ch等于-1 循环结束

评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
黄奕豪 + 1 赞一个!
zhangfeng + 6

查看全部评分

回复 使用道具 举报
还好有笔记支持,都快忘记滴说






public int myRead()throws IOException
        {
                //通过in对象读取硬盘上数据,并存储buf中。
                if(count==0)
                {
                        count = in.read(buf);
                        if(count<0)
                                return -1;
                        pos = 0;
                        byte b = buf[pos];
                        count--;
                        pos++;
                        return b&255;
                }
                else if(count>0)
                {
                        byte b = buf[pos];
                        count--;
                        pos++;
                        return b&0xff;
                }
                return -1;
        }
结论:
字节流的读一个字节的read方法为什么返回值类型不是byte,而是int。
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。
而在写入数据时,只写该int类型数据的最低8位。

评分

参与人数 1黑马币 +6 收起 理由
zhangfeng + 6 赞一个!

查看全部评分

回复 使用道具 举报
补上图片~~~

无标题.png (22.29 KB, 下载次数: 101)

无标题.png

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
他纠结的是C 与 java 的不同

…………C忘完了,要不就去实验下了。总感觉楼主 C 理解错了
回复 使用道具 举报
IO流中read():作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
方法返回的是int类型,而定义的ch也是int类型,用来接收fr.read()返回的值,
如果fr读到最后了,则fr.read()会返回一个-1,此时ch=-1;因为ch和-1都是int类型,所以两者当然可以比较,
-1!=-1 为假,所以while循环就结束了

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马