为啥在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 没有条件与和条件或运算符的复合赋值版本? (&&=, ||=)

java第三章笔记

为啥在java中不允许分配给'this'?

因为该组节的条件字段不存在或无效所以无法打印

一些赋值运算符在 AngularJS 表达式中不起作用.. 为啥不呢?

为啥析取赋值运算符 |= 不适用于布尔向量?