为啥在java中不允许没有括号的赋值和布尔运算符
Posted
技术标签:
【中文标题】为啥在java中不允许没有括号的赋值和布尔运算符【英文标题】:Why in java not allowed assignment and boolean operator without brackets为什么在java中不允许没有括号的赋值和布尔运算符 【发布时间】:2015-01-29 18:33:00 【问题描述】:对不起,奇怪的问题表述。如果有人知道如何使它变得更好,我会很高兴。 以免我们有 3 个布尔变量:
boolean a = false;
boolean b = false;
boolean c = false;
Java 允许编写以下代码:
System.out.println(a=b);
System.out.println(a==b & a==c);
从这两个陈述中,我预计以下内容也是合法的。
System.out.println(a=b & a=c);
我的问题是:为什么在第二种情况下不允许,而在第一种情况下允许?在第二种情况下,两个分配都以布尔值解析并且 & 对我来说看起来是合法的。
【问题讨论】:
你是不是错过了&&
--- 一个 & 符号!如答案中所述,这是按位计算的,优先级较低。
@shekharsuman Java 确实有一个&
布尔运算符;就像&&
,只是它没有短路
@fge-我在评论中也提到了!你应该检查一下,我想说它会短路!!!
@shekharsuman 抱歉,反应太快了;无论如何,我相信OP从事物的外观上知道这个操作员
@MSach 如果您必须根据数值操作标志;例如,Spliterator.characteristics()
。例如,如果您想测试拆分器是否具有DISTINCT
特性,您将测试theSpliterator.characteristics() & DISTINCT == DISTINCT
(或!= 0
)。当然,在 Java 中你不需要那么多,但它在 C 中很常见。另一种方法是获取 n
的下一个最接近的倍数,其中 n
是 2 的幂:nextMultiple = (orig + n - 1) & ~(n - 1);
【参考方案1】:
将你的最后一个 sn-p 更改为
System.out.println((a = b) & (a = c));
The assignment operator (=
) 比 boolean logical AND operator (&
) 具有 lower precedence。使用括号明确地对您的表达式进行分组。
【讨论】:
胡?它不是按位和布尔值吗? (是的,只有 1 位,但您仍然可以按位计算它们)。【参考方案2】:这是因为=
的优先级低于&
(顺便说一下,&
在您的 sn-ps 中是一个 boolean 运算符,而不是按位运算符;它是一样的和&&
一样,只是它没有短路)。
因此,您的表达式为(带括号):
a = (b & a) = c
但您不能将c
分配给b & a
。
【讨论】:
谢谢你!!!!根据link,您是绝对正确的。经过一年多的 Java 编程,现在我知道了运算符的优先顺序)))。阅读更多link 得到子表达式的求值顺序独立于关联性和优先级。 好吧,无论如何,经验法则总是一样的:如果你不记得运算符优先级,很可能括号是“王”,所以当你不确定时使用它们;)以上是关于为啥在java中不允许没有括号的赋值和布尔运算符的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Java 没有条件与和条件或运算符的复合赋值版本? (&&=, ||=)