2013-09-27 24 views
11

我试图运行一个按位数的比较,并且我的代码一直在用“if”语句在我的代码行30上出现非法的表达式开始。表达式非法开始Java布尔?

我的代码读取像这样:

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 "); 
    } 
} 
+0

'First_Relation = TRUE'应该是'First_Relation == TRUE'在'if' – Ashok

+16

为什么人们投票的问题了吗?它象提问者所能够清楚地说明问题,并表明努力。并非每个问题都必须涉及高级主题或面向高级编码人员。 – shovavnik

+0

你是说,第三条if语句? – Raedwald

回答

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) 

现在你还有一个分号dir在您的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)); 

...或者。

+0

打字+1(很多)比我快 – ivarni

+0

好的答案!如果(P> Q && R isnot2bad

+1

@ isnot2bad:True,会提及这一点。 –

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 "); 
    } 
+0

第一个代码片段仍然不会编译,而且您没有真正解释这些差异。 –

+0

考虑我更新的答案 – Ashok

+0

那么现在编译好了,但是你还没有解释为什么你把'&'改成'&&'或者'='改成'=='。 –

1

尝试采取

(First_Relation = true) & (Second_Relation = true) 

到支架。 并删除“;”从“if”语句的结尾,导致它没有任何意义:“;”被认为是一个新的语句终止(在你的情况下为空语句),并且你没有为“if”语句提供范围 - 它仅适用于下一个语句,即空语句。

4

据我所知,你不能使用&操作者在Java中执行双打之间的按位比较。它只能用于其他较简单的基元,如整数和字符。

此外,您使用的&操作,因为你使用它来比较P>QR<S,两者产生布尔值的结果将不执行数之间的按位比较的方式。

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

+0

他在哪里试图在双打之间进行按位比较? – matehat

+0

不在代码中。他的问题首先是:“我试图按比特进行比较...”。我的回答解释了为什么他的代码不能实现这个目标。此外,这符合&运算符的不正确用法,该运算符*是按位AND运算符。 – shovavnik

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