【问题标题】:add two char data type in java在java中添加两个char数据类型
【发布时间】:2018-11-21 20:38:04
【问题描述】:

案例一:

char c='A'+'A'; 
System.out.println(c);   // print question mark (?)

案例2:

char c1='A';
char c2='A'+c1;   // Compile time error
System.out.println(c2);   

如果我有逻辑当我添加两个 char 文字时,ascii 值的总和正在打印,这相当于问号的 ascii 值。 但在 case2 为什么编译时错误显示'无法从 int 转换为 char'

如果 char+char=int 则此规则必须适用于两种情况。

【问题讨论】:

  • 这个问题适用于所有需要在运行时进行缩小转换的整数类型。 (而且,这是唯一有意义的方法,因为将 UTF-16 代码单元添加到 UTF-16 代码单元的含义是什么?)

标签: java char ascii


【解决方案1】:

在第一种情况下,添加了两个 final 字符,并在编译时检查结果 int 是否溢出字符。

在第二种情况下,一个操作数不是最终的,编译器拒绝求和。 有点愚蠢,但考虑到多线程和其他情况,也许是合理的。至少是一个容易理解的规则。

在做

final char c1 = '0';
char c2 = '1' + c1; // 'a'

应该编译。

(不用说,永远不应该做像'0'+'1' 这样的事情。)

【讨论】:

  • 我想可以扩展"constant variable" 的定义,以包括使用"constant expression" 初始化的“有效最终”变量以及最终变量,但与往常一样,存在成本/收益-权衡考虑
  • 再想一想,JLS 中的这种更改不会向后兼容,因为它会影响在运行时与编译时评估哪些代码,哪些代码被认为是不可访问的,并且可能是大多数很难完全预料到所有后果 - class initialization
【解决方案2】:

添加或 2 个或更多 int 类型或低于 int 的变量导致 int 类型。

所以你对char c2 = 'A' + c1; 所做的实际上并没有给你一个 char 结果。它给你 int 结果,你试图隐式类型转换为字节,这会给你编译时错误。

总结 字符 + 字符 = 整数 而且Char不能直接存储Int。

尝试这样做 char c2 = (char)('A' + c1);

在这里,您将 int 值显式类型转换为 char 类型 告诉编译器您已准备好接受可能发生的有损转换

【讨论】:

  • char + char = int 也适用于第一种情况。但案例 1 工作正常。
  • 在情况 1 中,您存储的是 constants 而不是 char 变量的添加。
【解决方案3】:

在第二种情况下出现错误,因为 JLS 5.6.2 二进制表达式的两个操作数都转换为 int。

要使其工作,您应该添加显式转换:

char c2=(char)('A'+c1);

【讨论】:

  • 二进制表达式的两个操作数都转换为 int。也适用于第一种情况。但它工作正常。
【解决方案4】:

添加 Java chars、shorts 或 bytes 的结果是一个 int

查看这篇文章的详细答案: In Java, is the result of the addition of two chars an int or a char?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多