黑马程序员技术交流社区
标题:
不明白的是(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)
下载附件
2012-6-22 21:15 上传
作者:
丁二跃
时间:
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