2012-10-20 3 views
1

Я изучаю Java.Арифметика на char в java

Я должен написать программу, которая преобразует все прописные буквы в нижний регистр и все строчные в верхние регистры. Он сказал, что в книге мне просто нужно вычесть 32 из прописных букв и добавить 32 в нижний регистр.

Вот мой код ...

class Caseconv { 
    public static void main(String args[]) 
     throws java.io.IOException { 
      char ch; 

      do { 
      ch = (char) System.in.read(); 

      if (ch >= 97 & ch <= 122) ch = ch - 32; 
      if (ch >= 65 & ch <= 90) ch = ch + 32; 
      System.out.print(ch); 
      } while (ch != '\n'); 
     } 
} 

Но компилятор не хочет, чтобы сделать это, я получаю эту ошибку.

Caseconv.java:13: error: possible loss of precision 
      if (ch >= 97 & ch <= 122) ch = ch - 32; 
              ^
    required: char 
    found: int 
Caseconv.java:14: error: possible loss of precision 
      if (ch >= 65 & ch <= 90) ch = ch + 32; 
              ^
    required: char 
    found: int 
2 errors 

Что я должен делать, чтобы вычесть из char?

+0

См. Нижеприведенную ссылку. http://stackoverflow.com/questions/34411278/char-arithmetic-in-java/34411412#34411412 –

ответ

7

Вам нужно добавить приведение типа, чтобы преобразовать результат выражения char. Например.

ch = (char)(ch + 32) 

Примечание:

  1. Причины этого необходимо потому, что 32 является int буквальными и добавление char и int выполняется с использованием int арифметика, и дает int результата.

  2. Присвоение intchar потенциально может привести к усечению. Добавление типа cast эффективно говорит компилятору: «Да, я знаю. Все в порядке. Просто сделай это».

  3. Скобки вокруг + подвыражению необходимы, поскольку тип литой имеет более высокий приоритет, чем +. Если вы оставите их, тип-литье не имеет значения, потому что он «отливает» char в char.

2

Результат arithmetic между char и int является int, и вы не можете хранить int в char без explicit typecasting - с помощью которого вы сказать компилятору, что I know what I'm doing, now do it for me

Итак, вам нужно сделать приведение типа: -

char ch = 'a'; 
    if (ch >= 97 & ch <= 122) { 
     ch = (char)(ch - 32); 
    } 
    System.out.println(ch); // Prints `A` 

Но вы уже method в Character классе, который будет делать это для вас: -

char ch = 'a'; 
ch = Character.toUpperCase(ch); 
System.out.println(ch); // Prints `A` 
2

Попробуйте

ch = (char) (ch + 32); 

, если вы уверены, что ч + 32 не будет больше, чем то, что символ может держать.

3

Тип литья требуется, попробуйте этот код:

if (ch >= 97 & ch <= 122) 
    ch = (char) (ch - 32); 
if (ch >= 65 & ch <= 90) 
    ch = (char) (ch + 32); 
0

Это потому, что вы пытаетесь присвоить значение int (значение Ascii) для символа. Но вам нужно явно преобразовать значение результата int в char. Просто наложите int на char.

ch= (char) (ch+32); 
ch= (char) (ch-32); 

Он будет работать без каких-либо исключений.

Смежные вопросы