我一直在互联网上寻找凯撒密码,虽然我理解循环,但我不明白为什么这行代码能够将一个字符转换为另一个字符? 我不明白这里的这一行:
letter = (char)(letter - 26);
当我取出(字符)时,它不起作用,我从未见过它的类型在括号中,然后是操作。
希望这是一个简单的问题,感谢您的帮助。
for (int i = 0; i < buffer.Length; i++)
{
// Letter.
char letter = buffer[i];
// Add shift to all.
letter = (char)(letter + shift);
// Subtract 26 on overflow.
// Add 26 on underflow.
if (letter > 'z')
{
//The following line is the line I don't understand. Why char in parentheses then another parentheses?
letter = (char)(letter - 26);
}
else if (letter < 'a')
{
letter = (char)(letter + 26);
}
// Store.
buffer[i] = letter;
}
(char)
是一个演员表。 这意味着它采用一种类型的值,并将其转换为另一种类型的值。 因此,如果x
是一个int
,(double)x
产生一个double
,其值与整数值相同。
在此表达式中(char)
是必需的原因是 Java 对类型为 int
或 long
的值执行其所有整数算术。 所以即使letter
是char
,在表达式letter + 26
中,letter
也会自动转换为int
,然后26被加到整数中。 (char)
将其转换回char
类型(即从 0 到 65535 的整数值)。 Java不会自动将较大的整数类型(int
,其值从-2147483648到2147483647)转换为较短的整数类型(char
),因此有必要使用强制转换。
但是,Java确实允许这样做:
letter += 26;
具有相同的效果,并且不需要石膏。
字母中有26个字母,char是整数类型
char ch = 'Z' - 25;
System.out.println(ch); // <-- A
JLS-4.2.1 - 整型和值说(部分),
对于
char
,从 '\u0000' 到 '\uffff' (含),即从 0 到 65535