Java语法 - 强制转换后的额外加号是有效的吗?

Ian*_*edv 16 java syntax casting

所以,我碰到一些铸造时困惑我bytechar,平时我会做到这一点:

for (byte b:"ABCDE".getBytes()) {
    System.out.println((char)b);
}
Run Code Online (Sandbox Code Playgroud)

哪个会打印出来

A
B
C
D
E
Run Code Online (Sandbox Code Playgroud)

我不小心离开了和+之间(char),b并得到了相同的结果!?

像这样:

for (byte b:"ABCDE".getBytes()) {
    System.out.println((char) + b);
}
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

我基本上在做什么(char)(0x00 + b)?因为

System.out.println((char) - b);
Run Code Online (Sandbox Code Playgroud)

产生不同的结果.

注意:使用Java版本1.8.0_20

Pet*_*rey 26

为什么会发生这种情况?

如果你-在一个数字或表达式之前放置一元运算符,它就会否定它.

同样,如果你+在一个数字或表达式之前放置一元运算符,它什么都不做.

将字节转换为char的更安全的方法是

char ch = (char)(b & 0xFF);
Run Code Online (Sandbox Code Playgroud)

这适用于0到255之间的字符,而不是0到127.

顺便说一句,你可以使用一元运算符来编写一些令人困惑的代码

int i = (int) + (long) - (char) + (byte) 1; // i = -1;
Run Code Online (Sandbox Code Playgroud)


Dr.*_*ana 7

b是一个字节,也表示为+ b.例如,3也可以写为+3.所以,((char)+ b)与((char)b)相同


Mur*_*nik 5

+是一元加运算符 - 就像你可以说1相当于+1,b相当于+b.之间的空间+b无关紧要.此运算符具有比强制转换更高的优先级,因此在应用它之后(如上所述,什么都不做),byte然后将char结果转换为a 并产生与之前相同的结果.