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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

clevergump

中级黑马

  • 黑马币:184

  • 帖子:174

  • 精华:0

本帖最后由 clevergump 于 2014-10-8 00:57 编辑

我的疑问是:
循环语句的循环条件内,同一个语句中,为何不能同时进行局部变量的定义+赋值(其中,定义+初始化,使用括号运算符修饰使其优先于后面的条件判断的执行)+涉及到该局部变量的循环条件判断?

以毕老师 IO流 FileReader 的视频为例来描述我的疑问。为突出重点,在此省略了 try、catch、finally等语句,如下代码是毕老师的代码。
  1. FileReader fr = new FileReader("F:\\JavaProject\\data\\fileReaderDemo.txt");
  2. int ch = 0;
  3. while ((ch = fr.read()) != -1)
  4. {
  5.         System.out.println((char) ch);
  6. }
复制代码
其中的ch和while循环,如果改为如下写法会报错:
  1. while ((int ch = fr.read()) != -1)
  2. {
  3.         System.out.println((char) ch);
  4. }
复制代码

同样地,在for循环中,也是这种情况,也是局部变量的定义、初始化以及循环条件判断不能同时写在一个语句中。比如,下面的写法是可以的:
  1. for (int ch = 0; (ch = fr.read()) != -1;)
  2. {
  3.        System.out.println((char) ch);
  4. }
复制代码
但下面的写法就是错的:
  1. for ( ; ( int ch = fr.read()) != -1; )
  2. {
  3.        System.out.println((char) ch);
  4. }
复制代码

上面两个例子告诉了我,怎样使用就是对的,怎样使用就是错的,但我不知道错误用法的具体原因。我的疑惑是,既然已经使用括号运算符让赋值语句优先执行,执行完赋值后再去执行后面的判断语句,为何还是会报错呢?期待大神帮忙解答!谢谢!

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

6 个回复

倒序浏览
我也没看懂,同问
回复 使用道具 举报
没人帮顶啊!这个问题估计比较难
回复 使用道具 举报
首先你的说法就有错误:
  1. int ch = fr.read();
复制代码

这并不是一个赋值语句,它是一个局部变量声明语句。

  1. for(int i=0;;){}
复制代码

在上面的这句话中,for循环的初始化表达式实际上是赋值语句:
  1. int i=0;
复制代码

去掉分号之后形成的,但即便是去掉分号之后,它也不是一个表达式。
“局部变量声明表达式”?没有这种说法。

而它既然不是一个表达式,那当然不可能和其他表达式组成一个复合表达式。

最后说明一下,这个问题跟for循环或者while循环本身无关,不信的话你在main方法里面加入下面这句话:
  1. System.out.println(int x=0);
复制代码

或者
  1. boolean b = (int i=14)>4;
复制代码

编译照样通不过,这足以证明局部变量声明语句去掉分号之后根本不是一个表达式!

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

回复 使用道具 举报
水竹 发表于 2014-10-8 21:01
首先你的说法就有错误:
  
这并不是一个赋值语句,它是一个局部变量声明语句。

兄弟说的有道理,多谢了!

确实,那不是个赋值语句,不过在我还没有认真关注这个问题之前,我很可能就因为有这种简化书写的想法而真的写成这样了(不过Eclipse会当场就提示错误的),这个错误写法和“赋值+比较”的写法在外观上看还是有一定相似性的,所以如果先前没有认真思考过,而且万一当时脑袋不清醒,就有可能写出那样的错误代码。 再次感谢!
回复 使用道具 举报
。。。。。。。。。。。。。。。
回复 使用道具 举报
x564573138 来自手机 中级黑马 2014-10-8 23:11:11
7#
沙发。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马