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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李楠 黑马帝   /  2011-12-23 10:53  /  8124 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李楠 于 2011-12-23 13:12 编辑

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

我不明白的是(ch = fr.read())这个表达式可以和-1 比较。

把我最后发的提到前面来。

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

查看全部评分

12 个回复

倒序浏览
JDK 文档:
read
public int read()
         throws IOException读取单个字符。

覆盖:
类 Reader 中的 read
返回:
读取的字符,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

读取到最后的时候,返回-1,char ch= -1 这会报异常;
回复 使用道具 举报
public int read()
返回:
作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
回复 使用道具 举报
while((ch = fr.read()) != -1)  
这个代码为什么不是表示:如果fr.read()能赋值给ch为真,不能为假呢。

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

这句话是先把读到的值赋给ch,如果ch不等于-1,循环执行。如果ch等于-1 循环结束
回复 使用道具 举报
李楠 黑马帝 2011-12-23 11:06:22
报纸
到达流结尾返回-1 ,这个我知道,那判断的时候,应该是 fr.read() != -1.
可是其实是 先把fr.read()赋值给ch,然后这个赋值表达式去和-1比。
就是(ch = fr.read()) != -1;
这个就不能理解了。
回复 使用道具 举报
对象fr调用read方法,读取的是单个字符。
但是作为整数读取的字符,范围在 0 到 65535 之间 ,如果已到达流的末尾,则返回 -1 。
回复 使用道具 举报
李楠 黑马帝 2011-12-23 11:12:29
7#
袁泽宇 发表于 2011-12-23 11:06
while((ch = fr.read()) != -1)  
这个代码为什么不是表示:如果fr.read()能赋值给ch为真,不能为假呢。

和 -1 比得实际上是一个表达式呢,如果是在c语言里,这个表达式会返回0或者1。
现在在java里,如果是ch和-1做比较,应该是 ch = -1.
然后就不明白了。
回复 使用道具 举报
袁泽宇 黑马帝 2011-12-23 11:15:21
8#
本帖最后由 袁泽宇 于 2011-12-23 11:19 编辑
李楠 发表于 2011-12-23 11:12
和 -1 比得实际上是一个表达式呢,如果是在c语言里,这个表达式会返回0或者1。
现在在java里,如果是ch和 ...


!=       意思是不等于。
会返回true 和 fasle
回复 使用道具 举报
于汝国 黑马帝 2011-12-23 11:15:21
9#
在定义变量ch时,应该声明为整数数据类型,因为read方法读取的字符是作为整数(范围为0~65535)赋给ch的,然后再与-1做比较,这下明白了吗?
回复 使用道具 举报
李楠 黑马帝 2011-12-23 11:29:44
10#
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

查看全部评分

回复 使用道具 举报
杨强 黑马帝 2011-12-23 12:27:48
11#
首先while() 括号中 肯定是一个条件表达式  返回的是 true false
ch = fr.read();  给ch赋值  然后是逻辑运算符 !=  ch =-1 返回false
这里之所以要定义一个变量ch来接收 输入流read出的数据 是因为下面输出的时候用到ch达到遍历的效果
和其他语言对比着学习是好  但是在这意义不大 语法问题 理解记忆
回复 使用道具 举报
read()读完流之后  若在往下读会出现错误,而-1不是read方法读取的字符的值的范围。所以用while((ch=func())!=-1)来判断字符是否读完
回复 使用道具 举报

活动时间:2015年6月1日-2015年6月30日
活动一:
冲锋奖
1.
注册并实名送30元红包,充值并投资500元30元红包可直接提现。
2.
投资满1000元,投资人可再获得20元红包,推荐人再得10元推荐奖励。
3.
首次投资一万元(含一万元)送108元红包,可直接提现。
注:每个账号只能使用一次。
活动二:寻找好友奖
1、推荐好友充值投资10个人以上,返88元,每增加10个人增加50元奖励,10个人以上可兑现奖励。(投资人充值投资500元,推荐的好友充值投资500元,推荐人得10元推荐奖励)
2、推荐好友充值投资100个人以上含100个人,奖励:
iPad
mini
平板电脑(16G
WIFI版银色)(充值投资至少5万以上)
3、推荐好友充值投资200个人以上含200个人,奖励:
ipad
Air
平板电脑(充值投资至少10万以上)
4、推荐好友充值投资300个人以上含300个人,奖励:果6(土豪金16G)(充值投资至少15万以上)
5、推荐好友充值投资400个人以上含400个人,奖励:果6
plus(土豪金16G)
(充值投资至少20万以上)
活动三:
1、争分夺秒抢红包奖:
单标投资时间精确到秒,
名次以投资排名序号先后为准。
前三名时间为00秒的奖15元
前五名时间为08秒的奖10元
2、拼运气抢红包奖:单标投资排名序号为7或7的倍数奖现金红包20元。
3、冠军奖:单标累计投资金额前三名用户
一个月标:第一名:20元、第二名:15元、第三名:10元
三个月标:第一名:50元、第二名:30元、第三名:20元
六个月标:第一名:100元、第二名:70元、第三名:50元
注:争分夺秒抢红包奖,拼运气抢红包奖只能参加红包标。(红包标不包括1月标)
活动四:
定向约标三月标大奖:
1、单标充值投资5万元以上送IPad
mini
平板电脑
(16G
WIFI版银色)
2、单标充值投资6万元以上送Ipad
Air平板电脑
定向约标六月标大奖:
1、单标充值投资8万元以上送果6(土豪金16G版)
2、单标充值投资10万元以上送果6plus(土豪金16G版)
注:如不需要奖品,可市场价格8折折现。
所有活动奖励每周一结算一次,奖品,活动结束后请联系专属客服领取。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马