3

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

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;
    }
4

5 回答 5

5

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

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

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

于 2012-10-02T23:58:27.027 回答
3

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

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

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

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

ten==10 && (assignBool=boolTrue)
于 2012-10-02T23:59:16.613 回答
3

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

ten==10 && assignBool=boolTrue

被评估为

(ten==10 && assignBool) = boolTrue

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

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

ten==10 && (assignBool = boolTrue)
于 2012-10-03T00:05:03.203 回答
2

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

于 2012-10-02T23:59:44.760 回答
1

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

于 2012-10-03T00:00:00.747 回答