黑马程序员技术交流社区

标题: 不明白的是(ch = fr.read())这个表达式可以和-1 比较 [打印本页]

作者: zhangfeng    时间: 2012-6-22 21:04
标题: 不明白的是(ch = fr.read())这个表达式可以和-1 比较
本帖最后由 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做比较呢?

作者: 张华廷    时间: 2012-6-22 21:12
while((ch = fr.read()) != -1)  
这个代码为什么不是表示:如果fr.read()能赋值给ch为真,不能为假呢。

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

这句话是先把读到的值赋给ch,如果ch不等于-1,循环执行。如果ch等于-1 循环结束
作者: 吴超    时间: 2012-6-22 21:12
还好有笔记支持,都快忘记滴说






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位。
作者: 吴超    时间: 2012-6-22 21:16
补上图片~~~

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

无标题.png

作者: 丁二跃    时间: 2012-6-22 21:16
他纠结的是C 与 java 的不同

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




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