1

我正在学习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

我应该怎么做才能从字符中减去?

4

5 回答 5

8

您需要添加类型转换以将表达式的结果转换为char. 例如。

ch = (char)(ch + 32)

笔记:

  1. 这是必要的原因是因为32它是一个int文字,并且 achar和 an的加法int是使用int算术执行的,并给出一个int结果。

  2. 将 an 分配intchar可能会导致截断。添加类型转换有效地告诉编译器:“是的。我知道。没关系。就去做吧。”

  3. 子表达式周围的括号+是必要的,因为类型转换的优先级高于+. 如果您将它们排除在外,则类型转换没有任何区别,因为它将 a “转换”char为 a char

于 2012-10-20T06:38:27.277 回答
3

类型转换是必需的,试试这个代码:

if (ch >= 97 & ch <= 122)
    ch = (char) (ch - 32);
if (ch >= 65 & ch <= 90)
    ch = (char) (ch + 32);
于 2012-10-20T06:37:10.860 回答
2

a和 anarithmetic之间的结果是 an并且你不能在没有 a 的情况下存储 an - 你告诉编译器charintintintcharexplicit typecastingI 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`

但是,您已经methodCharacter课堂上,这将为您做到:-

char ch = 'a';
ch = Character.toUpperCase(ch);
System.out.println(ch);  // Prints `A`
于 2012-10-20T06:36:31.210 回答
2

尝试

ch = (char) (ch + 32);

如果您确定 ch + 32 不会比 char 可以容纳的大。

于 2012-10-20T06:36:35.443 回答
0

那是因为您试图为 char 分配一个 int 值(Ascii 值)。但是您需要将结果值显式转换为 int 为 char。只需将 int 转换为 char。

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

它将在没有任何异常的情况下工作。

于 2015-12-22T10:23:25.747 回答