有这样的代码:
boolean isValid(int ch) {
if(ch < '1' | ch > '7' & ch != 'q') return false;
else return true;
}
class HelpClassDemo {
...
do {
choice=(char) System.in.read();
} while(!hlpobj.isValid(choice));
}
这是个问题:
尽管选择类型为int ch
,我们在isValid(int ch)
使用char
的原因是什么?
我们不应该使用char ch
吗?如果我们应该使用int ch
,为什么会有这样的代码:(ch < '1' | ch > '7' & ch != 'q')
ch<1
或ch>7
不符合逻辑吗?我知道这是一个非常简单的问题,但我对此感到困惑。
答案 0 :(得分:1)
int
类型的范围比char
类型更宽(请参阅this数据类型范围表)。 IMO,接收一个字符作为int提供了某种溢出保护(欢迎对此观点),但这不是我要做的事情,因为我使用了正确的数据类型。
现在,比较时
if(ch < '1' | ch > '7' & ch != 'q') return false;
你隐式地将'1'和'7'转换为int类型,这是完全有效的。
最后,关于
ch&lt; 1或ch&gt; 7不合逻辑吗?我知道这是一个非常简单的问题但是 我对此感到困惑。
这是合乎逻辑的,但它不一样。
如果你执行ch > '1' && ch < '7
',则将ch与ASCII
值7(即55)和值1(即48)进行比较。基本上,您确定ch是一个2到6之间的字符,包括两个字符。
但是如果你做ch > 1 && ch < 7
,你要比较整数并验证ch表示的字符是2到6之间(包括两者)。这个字符很可能不是人类可读的。
如果你想让它们等效,你必须根据适当的char值进行比较,比如
if (ch > 48 && ch < 55)