11

我正在尝试运行按位数字比较,并且我的代码在代码的第 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 " );
    }
}
4

5 回答 5

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));

...或者任何你想要的表达方式。

于 2013-09-27T13:53:45.600 回答
4

据我所知,您不能使用 Java 中的运算符在doubles&之间执行按位比较。它只能与其他更简单的原语一起使用,例如 int 和 chars。

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

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

于 2013-09-27T15:58:33.077 回答
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 " );
    }
于 2013-09-27T13:55:50.097 回答
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);
于 2013-09-27T16:09:35.060 回答
1

尝试采取

(First_Relation = true) & (Second_Relation = true)

放入括号中。并删除“;” 从“if”语句的末尾开始,因为它没有意义:“;” 被视为新的语句终止(在您的情况下为空语句),并且由于您没有提供“if”语句的范围 - 它仅适用于下一个语句,即空语句。

于 2013-09-27T14:00:50.697 回答