非法表达式Java布尔值?

时间:2013-09-27 13:52:13

标签: java if-statement boolean bitwise-operators

我正在尝试运行按位数字比较,并且我的代码在我的代码的第30行上使用“if”语句继续出现非法表达式。

我的代码如下:

public class Project7 {

    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        double P = keyboard.nextDouble(); 
        double Q = keyboard.nextDouble();
        double R = keyboard.nextDouble();
        double S = keyboard.nextDouble();
        boolean First_Relation;
        boolean Second_Relation;

        if (P > Q) First_Relation = true;
        if (R < S) Second_Relation = true;

        if (First_Relation = true) & (Second_Relation = true); 
        System.out.println("Given the values for p,q,r, and s the expression "
        + "(p > q) && !(r < s) evaluates to " );
    }
}

5 个答案:

答案 0 :(得分:104)

if语句的格式为:

if (condition) statement

您目前已经两个括号内的条件......最终分配了值,这可能不是您想要的。

首先修复它以进行编译:

if ((First_Relation = true) & (Second_Relation = true))

然后将赋值更改为等式检查,否则它只会将true分配给两个变量,无论以前的值如何,条件都会通过:

if ((First_Relation == true) & (Second_Relation == true))

然后删除与布尔常量的比较:

if ((First_Relation) & (Second_Relation))

然后删除不必要的括号:

if (First_Relation & Second_Relation)

然后使变量遵循Java命名约定:

if (firstRelation & secondRelation)

然后使用更传统的&&代替& - &&是短路的,几乎总是你想要的:

if (firstRelation && secondRelation)

现在你的if条件之后你仍然会直接得到一个分号,这使得它毫无意义 - 它将总是执行System.out.println语句,因为这不是if声明的一部分。您可以只删除分号,但为了清晰起见,我添加了大括号:

if (firstRelation && secondRelation) {
    System.out.println("insert text here");
}

接下来,请注意,如果条件为真,您实际上只是初始化变量 - 因此您当前会因尝试读取未明确分配的变量而遇到编译时错误。

首先,确定明确的任务:

// Names changed to follow conventions
boolean firstRelation = p > q;
boolean secondRelation = r < s;

......上面的代码应该没问题。

接下来,发现你确实从那些额外的变量中获得的确非常少。改为内联条件:

if (p > q && r < s) {
    System.out.println("Given the values for p,q,r, and s the expression "
    + "(p > q) && !(r < s) evaluates to ";
}

此时,很明显还有一个错误 - 因为您的消息是!(r < s),但条件只是r < s。所以你需要决定你想要实现什么,并使代码和消息反映出同样的事情。请注意,您也没有完成此消息。实际上,你可以将整个过程简化为:

System.out.println("Given the values for p,q,r, and s the expression "
    + "(p > q) && !(r < s) evaluates to " + ((p > q) && !(r < s));

......或者你想要表达式实际上是什么。

答案 1 :(得分:4)

据我所知,您不能使用Java中的&运算符来执行双精度之间的按位比较。它只能与其他更简单的原语一起使用,如整数和字符。

此外,您使用&运算符的方式不会在数字之间执行按位比较,因为您使用它来比较P>QR<S的结果,两者都产生布尔值。

要在双打之间执行按位比较,您需要使用不同的技术直接将P与Q和R与S进行比较。以下是一种方法示例:https://stackoverflow.com/a/13928322/213343

答案 2 :(得分:2)

if (First_Relation == true && Second_Relation == true)
{
    System.out.println("Given the values for p,q,r, and s the expression "
    + "(p > q) && !(r < s) evaluates to " );
}

并且有效方式是

    if (First_Relation && Second_Relation)
    {
        System.out.println("Given the values for p,q,r, and s the expression "
        + "(p > q) && !(r < s) evaluates to " );
    }

答案 3 :(得分:1)

尝试

(First_Relation = true) & (Second_Relation = true)

括号内。 并删除“;”从“if”语句结束,导致它没有意义:“;”被认为是一个新的语句终止(在你的情况下为空语句),因为你没有提供“if”语句的范围 - 它只适用于下一个statemnt,即空语句。

答案 4 :(得分:1)

如果不满足条件,则没有消息。因此,我建议:

boolean evaluation = (P > Q) && !(R < S);
System.out.println("Given the values for p,q,r, and s the expression "
    + "(p > q) && !(r < s) evaluates to " + evaluation);