01/10/2018, 00:53
JAVA thứ tự các toàn tử
Chào mọi người, cho mình hỏi:TH1:
int i = 0; boolean f = false, b; b = (f || ((i++) == 0)); System.out.println(i);
thứ tự thực hiện có phải là i == 0 là true sau đó true || f rồi mới tăng i++ lên hay không
Còn nếu trường hợp 2:
> int i = 0; > boolean f = false, b; > b = (f || (i++) == 0); > System.out.println(i);
thứ tự có phải là f || i rồi so sánh ==0 sau đó i ++ lên hay không ạ.
Cảm ơn.
Bài liên quan
theo anh thì em hiểu sai thứ tự rồi.
tất cả ngôn ngữ đều bắt đầu từ () ở bên trong nhất rồi mới ra bên ngoài.
đầu tiên lưu ý là biến b là kiểu boolean nên kết quả phải là true/false.
thứ tự i++, f || ((i++) == 0)
f || ((i++) == 0: cái này là mệnh đề logic
trường hợp thứ 2 cũng tương tự như trên.
Em có thể chạy debug để hiểu thêm.
Hôm bữa mới chỉ là toán tử OR || là nếu mệnh đề đầu đúng thì không thực hiện mệnh đề sau, còn ngược lại nếu mệnh đề đầu sai thì mới tiếp tục mệnh đề sau mà.
Đã hướng dẫn rồi mà vẫn quên giờ lại suy ra logic sai bét nhè như thế này là sao ?
Còn việc dùng dấu () để group điều kiện thì với ((i++) == 0) hay (i++) == 0 hay i++ == 0 là như nhau. Tính chất ưu tiên không xuất hiện ở đây.
Dạ hiểu cái OR || rồi mà. Chỉ nói là cái ++ có lần đc nói là nó sẽ thực hiện sau khi tính toán nên ko biết thứ tự của nó, i++ == 0 là vẫn cộng i lên trước rồi mới so sánh với 0 còn nếu int k = i++ - 2 là thực hiện phép toán - rồi mới ++ i lên, ko hiểu rõ chỗ đó
như bạn @Nancru nói trên đó.
Thì nói chữ thì
mệnh đề f đúng thì dừng.
Nếu mệnh đề f sai thì chạy i++, rồi so sánh với 0.
Đó là thứ tự chạy.
Lật ngược lại cho mệnh đề b = f && (i++ == 0) . Thì mệnh đề này chạy như thế nào ?
i == 0 rồi đem && với f rồi mới tăng i
Chỗ này học cho kỹ vào nhé, trong lập trình không có khái niệm lúc compare trước lúc ++ trước nhé, nhảy búa lua nhé. Khác sâu vào não thật kỹ vào!
Thứ nhất là toán tử increment có đặc điểm là nếu i++ có nghĩa là get giá trị i đem đi so sánh trước rồi, sau khi so sánh == 0 rồi mới + vào. Còn nếu ++i có nghĩa là tăng i lên 1 rồi mới so sánh với == 0.
(f || ((i++) == 0));
Thứ hai, Với chỗ này, khi f = false, do tính chất của toán tử OR (||), nếu vế đầu đúng thì vế sau không thực hiện, còn vế đầu sai thì mới tính tiếp vế sau: tức là do f = false nên chương trình phải thực hiện tiếp ((i++) == 0) hay (i++) == 0 hay i++ == 0 , cả 3 phép so sánh này đều như nhau, tức là không có độ ưu tiên. Mà do phép toán là i++ nên nó sẽ so sánh i (lúc này đang bằng 0) với 0, thì kết quả ra true và i vẫn tăng lên 1.
=> Chỗ này vui lòng thử các trường hợp f = true/false và thay đổi i++/++i để kiểm chứng.
Thứ ba, khi đổi sang toán tử AND(&&), nếu vế đầu sai, thì nó sẽ không chạy vế sau, còn vế đầu mà đúng thì nó vẫn phải check tiếp vế sau. Chỗ này đừng nên cố gắng liên hệ với bitwise operations( | & ). Thì khi f = false, nó sẽ không check tiếp vế sau nên i vẫn bằng 0, và kết quả so sánh b là false. Nhưng khi chuyển f = true thì nó sẽ chạy vế sau, i++ == 0, do i++ là get ra so sánh trước rồi tăng lên 1 sau nên kết quả sẽ b = true và i tăng lên 1.
=> Chỗ này vui lòng thử các trường hợp f = true/false và thay đổi i++/++i để kiểm chứng.
Bạn tham khảo thêm nhé!