2013-09-27 148 views
11

Tôi đang cố gắng chạy so sánh số bitwise và mã của tôi tiếp tục với biểu thức bắt đầu bất hợp pháp trên dòng 30 của mã của tôi bằng câu lệnh "if".Bắt đầu bất hợp pháp biểu thức Java Boolean?

Mã của tôi đọc như vậy:

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' trong' if' – Ashok

+16

Tại sao mọi người bỏ phiếu cho câu hỏi? Nó nêu rõ vấn đề rõ ràng như người hỏi có thể, và thể hiện nỗ lực. Không phải mọi câu hỏi đều phải là về các chủ đề nâng cao hoặc nhắm mục tiêu các lập trình viên nâng cao. – shovavnik

+0

Ý bạn là, câu lệnh if thứ ba? – Raedwald

Trả lời

104

Một tuyên bố if có dạng:

if (condition) statement 

Bạn hiện đã có hai điều kiện trong ngoặc vuông ... mà cũng kết thúc chỉ định các giá trị, có thể không phải là những gì bạn muốn.

sửa chữa Vì vậy, đầu tiên để có được nó để biên dịch:

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

Sau đó thay đổi công việc để kiểm tra sự bình đẳng, vì nếu không nó sẽ chỉ đơn giản là gán true để cả hai biến và tình trạng này sẽ vượt qua bất kể giá trị trước đó của họ:

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

Sau đó, loại bỏ sự so sánh với các hằng số boolean:

if ((First_Relation) & (Second_Relation)) 

Sau đó, loại bỏ dấu ngoặc không cần thiết:

if (First_Relation & Second_Relation) 

Sau đó thực hiện các biến theo Java ước đặt tên:

if (firstRelation & secondRelation) 

Sau đó sử dụng thông thường hơn && thay vì &-&& là chập mạch, và hầu như luôn luôn những gì bạn muốn:

if (firstRelation && secondRelation) 

Bây giờ bạn vẫn có một thư mục bán kết tràng ectly sau khi điều kiện if của bạn, mà làm cho nó vô nghĩa - nó sẽ luôn luôn thực hiện các tuyên bố System.out.println, bởi vì đó không phải là một phần của tuyên bố if. Bạn thể chỉ loại bỏ các dấu chấm phẩy, nhưng tôi muốn thêm niềng răng cho rõ ràng:

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

Tiếp theo, lưu ý rằng bạn chỉ thực sự khởi tạo các biến của bạn nếu điều kiện là đúng - vì vậy bạn sẽ thấy hiện có được một lỗi biên dịch thời gian cho cố gắng để đọc các biến mà không chắc chắn được giao.

Thứ nhất, sửa chữa sự phân công rõ ràng:

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

... và các mã trên nên được tốt.

Tiếp theo, tại chỗ bạn thực sự đạt được rất ít thực sự từ các biến phụ đó.Inline các điều kiện thay vì:

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 "; 
} 

Tại thời điểm này, nó trở nên rất rõ ràng rằng có một lỗi nữa - bởi vì thông điệp của bạn nói về !(r < s) nhưng tình trạng này chỉ r < s là. Vì vậy, bạn cần phải quyết định những gì bạn muốn đạt được, và làm cho mã và thông điệp phản ánh cùng một điều. Lưu ý rằng bạn cũng không hoàn thành tin nhắn. Thật vậy, bạn có thể đơn giản hóa toàn bộ nội dung:

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

... hoặc bất kỳ điều gì bạn muốn biểu hiện thực sự là.

+0

+1 để nhập (rất nhiều) nhanh hơn tôi – ivarni

+0

Câu trả lời hay! Tôi cũng sẽ in cả hai biểu thức quan hệ khi chúng tăng cường khả năng đọc: nếu (P> Q && R isnot2bad

+1

@ isnot2bad: Đúng, sẽ đề cập đến điều đó. –

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

và cách hiệu quả là

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

Đoạn đầu tiên vẫn không biên dịch và bạn chưa thực sự giải thích sự khác biệt. –

+0

xem xét câu trả lời cập nhật của tôi – Ashok

+0

Vâng, bây giờ biên dịch, nhưng bạn đã không giải thích bất cứ điều gì về lý do tại sao bạn đã thay đổi '&' thành '&&' hoặc '=' thành '=='. –

1

Cố gắng lấy

(First_Relation = true) & (Second_Relation = true) 

vào dấu ngoặc đơn. Và xóa ";" từ cuối câu lệnh "if", khiến nó không có ý nghĩa: ";" được coi là một tuyên bố kết thúc mới (câu lệnh trống trong trường hợp của bạn) và khi bạn không cung cấp phạm vi cho câu lệnh "if" - nó chỉ hoạt động cho biểu thức tiếp theo, tức là câu lệnh rỗng.

4

Theo như tôi biết, bạn không thể sử dụng toán tử & trong Java để thực hiện một Bitwise so sánh giữa đôi. Nó chỉ có thể được sử dụng với các nguyên thủy đơn giản khác, như int và ký tự. Ngoài ra, cách bạn đang sử dụng toán tử & sẽ không thực hiện so sánh bit giữa các số vì bạn đang sử dụng nó để so sánh kết quả của P>QR<S, cả hai đều tạo ra giá trị boolean.

Để thực hiện so sánh bit giữa đôi, bạn cần sử dụng một kỹ thuật khác để so sánh trực tiếp P với Q và R với S. Dưới đây là ví dụ về cách thực hiện: https://stackoverflow.com/a/13928322/213343.

+0

Anh ấy đang cố gắng thực hiện so sánh bit giữa đôi? – matehat

+0

Không có trong mã.Câu hỏi của anh bắt đầu bằng: "Tôi đang cố gắng chạy so sánh số bitwise ...". Câu trả lời của tôi giải thích tại sao mã của anh ấy không hoàn thành mục tiêu đó. Ngoài ra, điều này phù hợp với việc sử dụng toán tử & toán tử không chính xác, mà * là * toán tử AND bitwise. – shovavnik

1

Nếu điều kiện không được đáp ứng thì không có thông báo. Do đó, tôi đề xuất:

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