首先,有一些背景知识:我是一名IT培训师,我想在我的10年级课程中介绍Java的布尔运算符。我的导师查看了我准备的工作表,并评论说我可以让他们只使用一个&或|。表示操作员,因为他们“做同样的事情”。
我知道&和&&之间的区别。
&是按位运算符,旨在在整数之间使用,以执行“位旋转”。
&&是旨在在布尔值之间使用的条件运算符。
为了证明这些运算符并不总是“做相同的事情”,我着手寻找一个示例,在该示例中,使用布尔值之间的按位运算会导致错误。我找到了这个例子
boolean bitwise;
boolean conditional;
int i=10, j=12;
bitwise = (i<j) | ((i=3) > 5); // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i<j) || (i=3) > 5 ; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
i=10;
bitwise = (i>j) & (i=3) > 5; // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i>j) && (i=3) > 5; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
此示例表明,如果必须在表达式的后半部分更改值,则这将导致结果之间的差异,因为按位运算符是一个急切的运算符,而条件语句则表现为短路(不评估第二个如果前半部分在&&情况下为false,在||情况下为true,则为一半。
我对这个例子有疑问。为什么要在比较值的同时更改值?这似乎不是一种健壮的编码方式。我一直不愿意在生产代码中在一行中执行多项操作。看起来像一个“编码牛仔”,对他的代码的可维护性没有良知。我知道在某些领域中代码需要尽可能的紧凑,但可以肯定这是一个不好的做法吗?
我可以解释一下鼓励使用&&和||的选择。在&和| 因为这是软件工程中公认的编码惯例。
但是有人可以给我一个更好的,甚至是真实世界的在条件表达式中使用按位运算符的示例吗?