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

2022-09-03 04:15:04

所以我在投掷时遇到了一些让我感到困惑的事情,通常我会这样做:bytechar

for (byte b:"ABCDE".getBytes()) {
    System.out.println((char)b);
}

这将打印出来

A
B
C
D
E

我不小心在和之间留下了一个,并得到了相同的结果!?+(char)b

这样:

for (byte b:"ABCDE".getBytes()) {
    System.out.println((char) + b);
}

为什么会发生这种情况?

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

System.out.println((char) - b);

产生不同的结果。

注: 使用 Java 版本 1.8.0_20


答案 1

为什么会发生这种情况?

如果将一元运算符放在数字或表达式之前,则会否定它。-

同样,如果将一元运算符放在数字或表达式之前,则它不执行任何操作。+

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

char ch = (char)(b & 0xFF);

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

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

int i = (int) + (long) - (char) + (byte) 1; // i = -1;

答案 2

b 是一个字节,也可以表示为 + b。例如,3 也可以写为 +3。因此,((字符) + b) 与 ((字符) b) 相同