2010-12-16 6 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がファイルの最後にある場合は、無限ループに入ります。もっと良いアプローチは、テキストを読み込み、標準のsplit( "")メソッドとInteger.parseInt()メソッドを使用することです。はるかに不明瞭で、ほぼ同じくらい速い。 –

+1

'Scanner'が良い選択です。 – khachik

+0

Peter Lawreyと同意します。これは非常に貧弱なコードです。 – EJP

答えて

3

ry-'0' ASCII文字に変換する '0' - '9'(0-9)に対応する十進値にryに格納されています。

'0'は0に、 '1'は1に変換されます。

0

AIX」答えは正しいのですが、私は小さな説明を追加してみましょう。

それはそれを理解するために、発現ry-'0'の異なるエンティティの種類を見ることが重要です。まあ、おそらくその前に、私たちは式またはXryY'0'

ryである種類XマイナスYで、減算、すなわち見ていることを認識しなければなりませんint0charです。 Javaでは、charintを上向きにキャストすることが可能です。 x-yのような算術式を使用するには、xyが同じ型でなければなりません。あなたのケースでは、あなたは限り種類が懸念しているとして、int - charある

ry - '0' 

を持っています。したがって、Java VMはcharを自動的にintにキャストします。これにより、マイナスの両方の引数がtypelyにマッチします。返される値がintの理由もその理由です。 rzの宣言をint rzからchar rzに変更することで確認できます。int(減算の結果)を明示的なキャストなしでchar変数(rz)に代入しようとしているとコンパイルすると文句を言うでしょう。