当前位置: 首页 > 知识库问答 >
问题:

为什么这个if语句,带有赋值和相等检查,评估为false?

卢元龙
2023-03-14

当Java if语句同时具有赋值和相等性检查-d时,它是如何工作的??

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

为什么这个印刷是假的?


共有3个答案

鲜于海
2023-03-14

表达式test1=false | | test1==false将在以下步骤中求值。

步骤:1-test1=false | | test1==false//的优先级最高

STEP: 2-test1=false||false//运算符||具有更高的优先级

步骤:3-test1=false

步骤:4-false

因为表达式的布尔值变为false。所以else语句正在执行。

龚奕
2023-03-14

基本上,这是一个优先问题。您假设您的代码相当于:

if ((test1 = false) || (test1 == false))

... 但事实并非如此。它实际上相当于:

if (test1 = (false || test1 == false))

... 这相当于:

if (test1 = (false || false))

(因为test1一开始是true

... 这相当于:

if (test1 = false)

它将值false赋值test1,结果表达式为false

有关运算符优先级的有用表,请参阅运算符Java教程。

邵弘义
2023-03-14

表达式的解析方式与您的想法不同。它不是

(test1=false) || (test1 == false)

在这种情况下,结果应该是true,但是

test1 = (false || test1 == false)

首先计算false | | test1==false表达式的值,它是false,因为test1在计算中被设置为true

以这种方式解析它的原因是|的优先级低于=运算符的优先级,但高于赋值运算符=的优先级。

 类似资料:
  • 我一直在想一些初学者的错误,最后我犯了语句中的错误。我对代码进行了一些扩展: 我已经看到语句返回true,它

  • 我目前正在修复别人的Java代码中的一个bug,但我无法解释这个bug。所讨论的代码是下面的if语句: 其中初始化为和函数如下所示: 令我困惑的是,即使被设置为false,代码仍然调用并执行函数。我一直认为这是不应该发生的短路。if语句本身总体上仍然被计算为false,因为只有第一个代码段中的else-block中的代码被执行。 那么,这个if语句为什么会有这样的行为呢?是短路失败,还是我误解了原

  • 这段代码给出的答案不是很直观: 0 1 我明白为什么会发生这种情况-赋值的左侧返回对底层值的引用,同时创建上述值,然后才使用新计算的对右侧进行评估映射。 这种行为在C标准中是否有表述?还是求值顺序没有定义? 使用g 5.2.1获得结果。

  • 问题内容: 给出以下代码: 为什么会这样?我以为布尔值会被强制转换为数字。因此变得和变。第二条if语句很有意义,但是我不明白为什么第一条语句导致要评估内部循环。这里发生了什么? 问题答案: 它被强制转换为布尔值。任何非空字符串的求值为true。 根据[ECMAScript语言规范]: ## 12.5 声明 ### 语义学 生产 IfStatement : Expression Statement

  • 有可能做如下事情吗: 或者: 我知道用很多if-else语句也可以实现同样的目标,但如果它像上面那样工作,看起来会更干净。

  • 问题内容: 说我有一大堆的是无论是变量或。我想在一个if语句中评估一组这些变量,以查看它们是否都像这样: 除非那行不通。我知道我可以这样做: 但这是非常丑陋的-特别是如果这些if语句将在我的代码中频繁出现。有什么方法可以使用更简洁的语法进行此评估(例如第一个示例)? 问题答案: 您永远不要使用(或)测试布尔变量。相反,要么写: 或使用(以及相关问题的表弟): 或使用Python的可传递比较: