中易网

程序读取到==跟=的时候,分别怎么处理的?谁能看明白?还有 f.unread(c)方法在这里起到一个什么作用?

答案:1  悬赏:0  
解决时间 2021-01-13 18:39
  • 提问者网友:寂寞梧桐
  • 2021-01-13 07:04
程序读取到==跟=的时候,分别怎么处理的?谁能看明白?还有 f.unread(c)方法在这里起到一个什么作用?
最佳答案
  • 二级知识专家网友:独钓一江月
  • 2021-01-13 08:21
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PushbackInputStream;

public class PushBack {

public static void main(String[] args) throws IOException {

 String s = "f(a==4)a=0;
";
          byte buf[] = s.getBytes();
          ByteArrayInputStream in = new ByteArrayInputStream(buf);
          PushbackInputStream f = new PushbackInputStream(in);
     int c;
          while((c=f.read())!=-1){
          //此时C读取到了一个字符
          switch(c){
          case'=':
          //读取到了=
          //这时需要再读取一个字符,来判断是不是为 '=='
          //请注意,即使这里不是=,程序也读取了一个字符
              if((c=f.read())=='='){
             //是==则输出
              System.out.println(".eq.");
              System.out.println("c的值:"+(char)c);
              }else{
              //否则不是==
              //则把读取的那个字符退回输入流
              //如果是=0,那么0不就丢失了吗,没法判断完整
              //你可以把f.unread(c)去了调试一下,有不同的结果
              //此处没有f.unread(c)会丢失=后面的0字符
              System.out.println("<-");
              f.unread(c);//这句就是把读取到的c退回输入流
              }
          break;
          default:
          System.out.println((char)c);
              break;
          }
          }
 
          System.out.println("程序结束啦");
}

} f.unread(c);的作用就是用来判断==时用的 ,当读取到了=后,为了判断是不是==会多读取一个=后面的字符进行判断,如果只是一个=,那么刚才多读取一那个=号后面的字符需要退回输,否则下一轮循环时会丢失=后面的字符,无法判断完整

追问:case'=':
//读取到了=
//这时需要再读取一个字符,来判断是不是为 '=='
//请注意,即使这里不是=,程序也读取了一个字符
==================================
这里为什么读到 = 还要继续读一个字符呢?我是java新手,请帮忙解释下。
追答:因为 case 判断的是字符 而== 是两个字符 ,case没法判断,它只能判断一个,所以这个程序就是读取到一个= 然后再读取一个=后面的字符,凑成两个,再判断是不是==是则输出一个信息,不是则退回多读取的那个=后面的字符,输入另一个信息

补充一下:jdk1.7已经支持case判断字符串了,1.6还不支持的,但为了移植考虑,建立还是兼容一下旧版本的写法

判断==的方法一止 这一种,但这个题的目的不是让你去找更简单的方法,而是让你理解一下基本的知识点而已,
你真要直接去判断==,那么突然有一天,有一个程序必要要用到一个字一个字的判断时你怎么办?
追问:case'=': 这个 不就是判断了读到的字符是不是= 吗?(c=f.read())=='=' 这个就是判断读取到的c 是 = ,然后就应该执行System.out.println(".eq.");这句话; 我是这么理解的,虽然是错的,我就没理解为什么case 这块
追答:case其实基本和if等同,但每一次c=f.read(),c的值都向后读取一位

case'=':
        //这时c的肯定值为=,否则不会case进
        //但当一下句判断时c=f.read()时
        //c的值就不一定还为=后了,他是向后又读取了一位
        if((c=f.read())=='='){ case不理解的话,这样写呢 你会发现在,case就是个变了样子的if else嘛

public class PushBack {

public static void main(String[] args) throws IOException {

 String s = "f(a==4)a=0;
";
          byte buf[] = s.getBytes();
          ByteArrayInputStream in = new ByteArrayInputStream(buf);
          PushbackInputStream f = new PushbackInputStream(in);
     int c;
          while((c=f.read())!=-1){
          //此时C读取到了一个值
          if(c == '='){
              if((c=f.read())=='='){
              System.out.println(".eq.");
              System.out.println("c的值:"+(char)c);
              }else{
              System.out.println("<-");
              f.unread(c);
              }
          }else{
          System.out.println((char)c);
          }
          }
          System.out.println("程序结束啦");
}
}
追问:我好像明白点了read()方法即便zaiwif判断里面也是在不断执行的是吗?所以在做判断的时候判断的其实是第二个=,对不对?
追答:对,每次f.read(),c取的值都是下一位字符,而不是又重新读取原位一次
比如,你上机调试一下,就看的很清楚
String s = "f(a==4)a=0;\n";
if((c=f.read()){
System.out.println(c); //输出f

}
if((c=f.read()){
System.out.println(c);//输出(
}
if((c=f.read()){
System.out.println(c);//输出a
}
追问:非常感谢你这么晚还来帮我!感激之情无以言表新手上路困难重重,幸亏有好心人帮忙
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息