当前位置: 首页 > 面试题库 >

为什么一个字符+另一个字符=奇怪的数字

太叔马鲁
2023-03-14
问题内容

这是代码片段:

public static void main (String[]arg) 
{
    char ca = 'a' ; 
    char cb = 'b' ; 
    System.out.println (ca + cb) ; 
}

输出为:

195

为什么会这样呢?我认为'a' + 'b'是,要么"ab""12"3

这里发生了什么?


问题答案:

+char是算术加法,不是字符串连接。您必须执行"" + ca + cb或之类的操作,或使用String.valueOfCharacter.toString方法来确保操作符中的至少一个+String用于字符串串联的运算符。

[JLS

15.18加法运算符](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18)

如果+运算符的任何一个操作数的类型为String,则该操作为字符串连接。

否则,运算+符的每个操作数的类型必须是可转换为原始数字类型的类型,否则会发生编译时错误。

至于为什么要得到195,这是因为使用ASCII,'a' = 97'b' = 9897 + 98 = 195

这执行基本intchar强制转换。

 char ch = 'a';
 int i = (int) ch;   
 System.out.println(i);   // prints "97"
 ch = (char) 99;
 System.out.println(ch);  // prints "c"

这忽略了字符编码方案的问题(初学者不应该担心…!)。

值得注意的是,Josh Bloch指出,不幸的+是,对于字符串连接和整数加法都被重载了(“对于字符串连接,重载+运算符可能是一个错误。”- Java
Puzzlers
,难题11:最后笑)。通过为字符串串联使用不同的标记,可以很容易地避免许多此类混淆。

也可以看看

  • 串联一个空字符串来进行字符串转换真的那么糟糕吗?


 类似资料:
  • 问题内容: 我从书中看到以下代码: 但没有提到为什么“一个”大于“四个”。我试过了,它小于a和b。我想知道JavaScript如何比较这些字符串。 问题答案: 因为和许多编程语言一样,字符串是按字典顺序进行比较的。 你可以认为这是一个空想家版本的字母顺序,区别在于字母排序仅覆盖了26个字符通过。

  • 我正在研究将字符串从一个字符集转换为另一个字符集,阅读了很多关于它的示例,最终找到了下面的代码,这对我来说很好,作为一个字符集编码的新手,我想知道,这是否是正确的方法。 要将字符串从ASCII转换为EBCDIC,我必须执行以下操作: 要将EBCDIC转换为ASCII,我必须:

  • 问题内容: 我是Java的新手,为了实践起见,我试图创建一个十六进制到十进制的数字转换器,因为我已经成功地制作了一个二进制到十进制的转换器。 我遇到的问题基本上是将一个字符串中的给定字符与另一个字符串进行比较。这就是我定义要比较的当前字符的方式: 这是我尝试比较角色的方法: 当我尝试通过仅输入数字(例如12)来运行代码时,它可以工作,但是当我尝试使用“ b”时,会出现一个奇怪的错误。这是运行程序的

  • 例如: 字符串1=helloworld字符串2=asdfuvjerhelloworld 这应该是真的。 另一个例子:字符串1=helloworld字符串2=lshewodxzr 这也应该是真的。 所以我正在研究如何创建一个方法,它将返回一个布尔值,检查第二个字符串是否包含第一个字符串中的字母。在第二个示例中,string2只有一次字母l,尽管字母l在string1中出现了三次,但仍然返回true。

  • 如何检查一个字符串是否在另一个字符串中,但匹配项需要在前面,而不是中间或最后。例如,a="

  • 问题内容: 我有一些奇怪的字符串池行为的问题。我正在使用比较相等的字符串来找出它们是否在池中。 输出为: 这对我来说是一个很大的惊喜。有人可以解释一下吗?我认为这是在编译时发生的。但是,为什么添加到String 根本没有任何区别呢? 问题答案: 是一个编译时常量,而 不是。因此,前者仅编译为字符串常量“ 555”,而后者则编译为实际的方法调用和串联,从而生成一个新的String实例。 另请参见JL