bufferedinputstream help - PullRequest
       4

bufferedinputstream help

0 голосов
/ 16 декабря 2010

Я где-то видел следующий код, и меня смущает (ry-'0 ') часть.что это делает?bis - буферизованный входной поток, а input - строка из нескольких целых чисел, каждое из которых разделено пробелом (т.е. 1 2 3 4 5 6).

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;
 }

Ответы [ 2 ]

3 голосов
/ 16 декабря 2010

ry-'0' преобразует символ ASCII '0' - '9', хранящийся в ry, в соответствующее десятичное значение (0-9).

'0' преобразуется в 0, '1'до 1 и т. д.

0 голосов
/ 16 декабря 2010

aix 'ответ правильный, но позвольте мне добавить небольшое объяснение:

Важно понять типы различных сущностей выражения ry-'0', чтобы понять его. Что ж, возможно, даже до этого нам нужно понять, что мы смотрим на вычитание , то есть на выражение или вид x минус y , где x ry и y is '0'

ry - это int, 0 - это char. В Java возможно приведение вверх char к int. Чтобы арифметическое выражение типа x - y работало, x и y должны быть одного типа. В вашем случае у вас есть

ry - '0'

то есть int - char, что касается типов. Таким образом, ваша виртуальная машина Java автоматически преобразует тип char в int, что приводит к тому, что оба аргумента минуса совпадают по типу. Это также причина того, что возвращаемое значение имеет тип int. Вы можете проверить это, изменив объявление rz с int rz на char rz: компиляция будет жаловаться, что вы пытаетесь присвоить int (результат вычитания) переменной char (rz ) без явного приведения.

...