这行Java代码在做什么?

时间:2018-05-22 22:21:51

标签: java types charat

请考虑这段Java代码。它有效,但我试图了解它的作用。

char str   = 'foo'
long prime = 503;
long hash  = 0;
hash = prime + str.charAt(1);

我感到困惑,因为这是不同数据类型的数学加法。如果我认为为了这个数学运算的目的而将字符转换为ASCII值,我会是正确的吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

首先,你的语法错了。我更正了(见下面的代码)。现在hash的值将为614.因为hash = prime + str.charAt(1)表示您要在str的索引1处添加字符的ASCII值,即oo的ASCII值为111。因此,添加后hash的值为614。

String str   = "foo";
long prime = 503;
long hash  = 0;
hash = prime + str.charAt(1);
System.out.println(hash); // This line prints 614. Because value prime is 503 and the ASCII value of `o` is 111.

您可以使用此Ideone https://ideone.com/EcbP8x并运行代码以查看输出。

修改

正如@Henry指出的那样,字符的值不仅限于Java中的ASCII值。因此,这里使用的更好的术语是Unicode代码点而不是ASCII值。要了解更多详情,请参阅What's the difference between ASCII and Unicode?

答案 1 :(得分:4)

是。根据{{​​3}},当您将加法操作+应用于longchar时,"加宽基元转换"将在char上执行,并且将使用两个long值执行添加。

答案 2 :(得分:2)

  

如果我认为角色被转换为它,我会是正确的   用于此数学运算的ASCII值?

是(除非您需要将第一行更改为String str = "foo";。基本上char是一种可用于算术表达式的整数类型。

Javadoc说:

  

charAt

     

public char charAt(int index)

     

返回的char值   指定的索引。

JLS(Java语言规范)说:

  

第4章类型,值和变量

     

数字类型是   整数类型byteshortintlongchar

  

<强> 4.2。原始类型和值:

     

char,其值为16位无符号整数,表示UTF-16   代码单元(§3.1)“

  

<强> 4.2.1。积分类型和值

     

对于char,从'\u0000''\uffff',包括065535

  

<强> 5.6.2。二进制数字促销

     

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:

     

...

     

应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     

...如果任一操作数的类型为long,则另一个操作数转换为long。

  

<强> 15.18.2。数字类型的加法运算符(+和 - )

     

二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。

     

对操作数执行二进制数字提升(第5.6.2节)。