11

ビット単位の数値比較を実行しようとしていますが、コードの 30 行目で "if" ステートメントを使用すると、Illegal start of expression が発生し続けます。

私のコードは次のようになります。

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

現在、括弧でくくられた条件が2 つあります...これも最終的に値を割り当ててしまいますが、これはおそらくあなたが望むものではありません。

したがって、最初に修正してコンパイルします。

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.printlnif

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

次に、条件が true の場合にのみ実際に変数を初期化していることに注意してください。したがって、現在、確実に割り当てられていない変数を読み取ろうとすると、コンパイル時にエラーが発生します。

まず、明確な割り当てを修正します。

// 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 や char などの他の単純なプリミティブでのみ使用できます。

さらに、演算子を使用している方法では、数値間のビットごとの比較は実行されません。これは、両方ともブール値を生成すると&の結果を比較するために使用しているためです。P>QR<S

double 間のビットごとの比較を実行するには、別の手法を使用して、P と Q および R と S を直接比較する必要があります

于 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

取ってみてください

(First_Relation = true) & (Second_Relation = true)

かっこに。「;」を削除します。「if」ステートメントの最後から、それは意味をなさない原因です:「;」新しいステートメントの終了(あなたの場合は空のステートメント)と見なされ、「if」ステートメントの範囲を指定しなかったため、次のステートメント、つまり空のステートメントに対してのみ機能します。

于 2013-09-27T14:00:50.697 に答える
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 に答える