我无法理解为什么在这种情况下程序正常工作:
do {
i = f1.read(); // i is integer
j = f2.read(); // j is integer
if (Character.toLowerCase(i) != Character.toLowerCase(j)) break;
} while (i != -1 && j != -1);
但在这种情况下,程序无限期执行:
do {
i =(char) f1.read();
j =(char) f2.read();
if (Character.toLowerCase(i) != Character.toLowerCase(j)) break;
} while (i != -1 && j != -1);
我知道可以隐式转换int到char,但如果我明确地转换它 - 它不起作用,为什么? 或者我理解错了什么?
答案 0 :(得分:3)
char
永远不能等于-1(它是无符号类型),因此当您输入-1并将其强制转换为char
时,它变为正数并且循环为&#39 ;结束条件永远不会得到满足。
即
int i = -1;
和
int i = (char) -1;
不要为i
分配相同的值。
答案 1 :(得分:2)
根据Oracle Java doc
char:char数据类型是一个16位Unicode字符。它有 最小值'\ u0000'(或0)和最大值'\ uffff'(或 65,535(含))。
char
永远不会持有负值
因此,条件while (i != -1 && j != -1)
将始终为true,循环将无限期运行。
此外,当您尝试将negative values
分配给char
时,它会将该值旋转到另一个(最大)结尾。
char c;
c = (char) 65; // 'A'
c = (char) -100; // 'ワ' and it results in 65,535(inclusive) - 100 = (char) 65,436
c = (char) 65436; // 'ワ'
int i;
i = (char) 65; // 65
i = (char) -1; // 65535 : notice how the char value cycles through the other end
i = (char) -100; // 65436 : same as (char) -100. Here, int returns 65,436.
证明i
和j
永远不会少于0
且循环条件始终为true
的替代方法。
答案 2 :(得分:0)
每个整数变量所需的空间为4个字节,每个 char 所需的空间仅为1个字节。由于每个空格都以2的补码表示, char 变量不能在其空间中保持-1(因为它是无符号的)并且它必须保持为正值。因此,最好使用整数值来保持代码逻辑和条件。