2010-12-16 58 views
0

我看到下面的代码在某处,而我被(ry-'0')部分弄糊涂了。那是做什么的? bis是一个缓冲输入流,输入是多个整数的行,每个整数由一个空格分隔(即1 2 3 4 5 6)。bufferedinputstream help

static int num()throws IOException{ 
    rz=0; 
    while((ry=bis.read())<'0' || ry>'9'){} 
    rz+=(ry-'0'); 
    while((ry=bis.read())>='0' && ry<='9') 
    rz=rz*10+(ry-'0'); 
    return rz; 
} 
+1

如果bis位于文件末尾,则会进入无限循环。更好的方法是阅读文本并使用标准拆分(“”)和Integer.parseInt()方法。更隐蔽,几乎一样快。 – 2010-12-16 17:48:57

+1

'扫描仪'将是一个更好的选择。 – khachik 2010-12-16 17:58:47

+0

同意Peter Lawrey。这是非常糟糕的代码。 – EJP 2010-12-17 01:59:10

回答

3

ry-'0'将ASCII字符 '0' - '9' 存储在ry到对应的十进制的值(0-9)。

'0'转换为0,'1'转换为1等等。

0

AIX”答案是正确的,但让我增加一个小的解释:

这要看类型表达ry-'0'的不同实体,以了解这一点很重要。好了,甚至在此之前,我们必须认识到,我们正在寻找一个减法,即在一个表达式或那种X减Y其中Xryÿ'0'

ryint0char。在Java中,可以向上投charint。对于像x - y这样的算术表达式,xy必须是相同的类型。你的情况,你有

ry - '0' 

就是int - char据类型有关。因此,你的Java虚拟机会自动将char转换为int,这将使得两个参数都为负数匹配。这也是返回值为int的原因。编译,然后会抱怨说,你想没有一个明确的转换分配int(该减法的结果)的char变量(RZ):您可以通过从int rzchar rz改变RZ申报检查。