【问题标题】:Compilation error in if-conditionif条件下的编译错误
【发布时间】:2012-09-23 21:16:09
【问题描述】:

在最后一个条件下,我期望从运算符“&&”左侧的表达式开始评估条件,该表达式变为真,然后是右侧的语句 .但是,我在这里收到编译错误,说“令牌上的语法错误“=,!=预期”。 对这个问题的任何解释都会有很大帮助。

boolean boolTrue=Boolean.TRUE;
    boolean assignBool=Boolean.FALSE;
    int ten=10;

    //eventually evaluates to true , runs okay
    if(assignBool=boolTrue){
        System.out.println("Executed");
    }
    //evaluates to true && true: runs correctly
    if( assignBool=boolTrue && ten==10 )
        System.out.println("Executed");

    //evaluates to true && true : runs correctly
    if( ten==10 && (assignBool=boolTrue)  )
        System.out.println("Executed");

    /*was supposed to evaluate to true && true : but gives compile error
    compiler expects me to use '!=' or '==' operator though the second statement ultimately evaluates to true 
    as in above case*/
    if( ten==10 && assignBool=boolTrue  )//Compile error
        System.out.println("Executed");

编辑:感谢您的回答。为了检查它是否是操作者优先级问题,我在 for 循环中运行了相同的案例,是的,就是这样。

    boolean boolTrue=Boolean.TRUE;
    boolean assignBool=Boolean.TRUE;
    int ten=10;

    singleloop:
    for(int i=0;((ten==10 && assignBool)==boolTrue);System.out.println("Executed")){
        i++;
        if(i>10)
            break singleloop;
    }

【问题讨论】:

  • 这不是优先问题吗?

标签: java compiler-errors conditional-statements


【解决方案1】:

编译器正在尝试评估最后一个if,就好像它是写的一样

if( (ten==10 && assignBool)=boolTrue  )

这没有意义,因为左侧不是左值(从 C 中借用一些词汇)。这是因为 && 在 Java 中的优先级高于 =

【讨论】:

  • 我知道,但请看上面的场景。在条件下,如果它评估为 "true" 或 "false" ,它必须成功执行。这意味着,作业只评估布尔值。
  • @vandey - 我详细阐述了我的答案。
  • 这就是我的感觉,但由于我使用的是短路运算符 && ,编译器不是应该分别评估右手和左手表达式吗?
  • @vandey 但它必须知道哪个是“左”和“右”,并且它使用优先级来确定。除此之外,编译过程早在评估之前就发生了,并且您有一个语法错误因为影响解析的优先规则。跨度>
  • @vandey - 运算符优先级使右手表达式assignBool,而不是assignBool=boolTrue
【解决方案2】:

从 Java 教程中的 nice table 可以看出,赋值运算符在所有运算符中的优先级最低。也就是表达式

ten==10 && assignBool=boolTrue

被评估为

(ten==10 && assignBool) = boolTrue

但左边的表达式是不可赋值的。

如果你想要不同的优先级,你必须使用括号,即

ten==10 && (assignBool = boolTrue)

【讨论】:

    【解决方案3】:

    我从您的代码中假设您正在尝试使用并且实际上想要将 boolTrue 分配给 assignBool。

    问题在于运算符的顺序。 && 的优先级高于 = (source)。它通过与 10==10 表达式进行与运算来创建一个布尔值。结果是非左值(无法写入的表达式)。您的表达式相当于全括号:

    ((ten == 10) && assignBool) = boolTrue
    

    正如您已经发现的那样,以下是执行此操作的方法:

    ten==10 && (assignBool=boolTrue)
    

    【讨论】:

      【解决方案4】:

      我不知道 java,但它可能比其他运算符绑定 && 更强。

      【讨论】:

        【解决方案5】:

        它被评估为if((ten==10 && assignBool)=boolTrue ),这意味着您正在尝试分配给一个常量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-29
          • 2014-08-10
          • 2014-12-01
          • 2014-08-14
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          相关资源
          最近更新 更多