【问题标题】:Illegal Start of Expression Java Boolean?表达式Java布尔值的非法开始?
【发布时间】:2013-10-03 20:34:19
【问题描述】:

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

【问题讨论】:

  • First_Relation = trueif 中应该是First_Relation == true
  • 为什么人们对这个问题投了反对票?它尽可能清楚地说明问题,并展示了提问者的努力。并非每个问题都必须与高级主题或针对高级编码人员有关。
  • 你的意思是,第三个 if 语句?
  • @shovavnik 这个问题并没有说明他试图解决syntactical error 的问题,这就是原因。

标签: java if-statement boolean bitwise-operators


【解决方案1】:

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)

然后使用更传统的&amp;&amp; 而不是&amp; - &amp;&amp; 是短路的,并且几乎总是你想要的:

if (firstRelation && secondRelation)

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

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 &lt; s),但条件只是r &lt; 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));

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

【讨论】:

  • 不错的答案!我还将内联两个关系表达式,因为它们确实增强了可读性: if (P > Q && R
  • @isnot2bad:是的,会提到的。
  • @isnot2bad:哎呀,还有一个明确的分配问题,并且消息是错误的。哎呀。
  • “所以你需要决定你想要实现什么,并使代码......反映同样的事情。”通往幸福的道路就是这样。
【解决方案2】:

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

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

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

【讨论】:

  • 他在哪里尝试在双打之间进行按位比较?
  • 不在代码中。他的问题始于:“我正在尝试进行按位数字比较......”。我的回答解释了为什么他的代码没有实现这个目标。另外,这符合 & 运算符的错误使用,它 按位 AND 运算符。
【解决方案3】:
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 " );
    }

【讨论】:

  • 第一个 sn-p 仍然无法编译,您还没有真正解释差异。
  • 现在可以编译了,但是您没有解释为什么将&amp; 更改为&amp;&amp;= 更改为==
【解决方案4】:

尝试服用

(First_Relation = true) & (Second_Relation = true)

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多