2010-12-16 93 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申報檢查。