0
if (array[i]<(char)65 || array[i]>(char)122 && 
                               array[i]>(char)91 || array[i]<=(char)96)
  System.out.println("False")

在这段代码中,当我尝试将字符“C”(即 67 btw)分配给 array[i] 时,它仍然显示为 false。我做了数学计算,它不应该像我在这条线下面所说的那样打印“假”。

(67 < 65 = 0 || 67 > 122 = 0) = 0

(67 > 91 = 0 || 67 <= 96 = 1) = 1

所以,这给我们留下了: 0 & 1 = 0 。有任何想法吗?

4

3 回答 3

3

使用一些格式,您的代码是:

if ( array[i] < (char)65 || array[i] >  (char)122 &&
     array[i] > (char)91 || array[i] <= (char)96     )
  System.out.println("False");

由于&&优先级高于||(参见运算符),这相当于:

if (    array[i] <  (char)65
   || ( array[i] >  (char)122 && array[i] > (char)91 ) 
   ||   array[i] <= (char)96 )
  System.out.println("False");

其中,由于&&是短路,因此在行为上等效于:

if (  array[i] < (char)65
   || array[i] > (char)122 
   || array[i] <= (char)96 )
  System.out.println("False");

其中,由于最后一种情况涵盖了第一种情况,因此在逻辑上等价于:

if ( array[i] > (char)122 || array[i] <= (char)96 )
  System.out.println("False");

只要它的值大于 122 或小于或等于 96,您就会打印False。67 小于 96,因此您打印False. 正如评论中指出的那样,运算符有优先级。与其学习所有细节(预测这样的情况),不如使用足够多的括号更容易。

于 2013-11-13T18:14:13.570 回答
1

首先&&评估 ,然后||根据Java Operator Precedence评估。所以它被评估为'C'的以下方式

67>122 && 67>91 //false
67<65 || false //false
false || 67<=96 //true

如果你使用括号,它将解决这个问题

if ((array[i]<(char)65 || array[i]>(char)122) && 
                           (array[i]>(char)91 || array[i]<=(char)96))
于 2013-11-13T18:20:57.247 回答
0

我想你可以通过使用括号来试试这个()

if ((array[i]<(char)65 || array[i]>(char)122) && (array[i]>(char)91 || array[i]<=(char)96))
      System.out.println("False")

还要注意&&具有更高的优先级

于 2013-11-13T18:14:29.383 回答