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.

vũ xuân quân viết 02:59 ngày 01/10/2018

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.

b = (f || ((i++) == 0));

đầ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.

anon52681320 viết 02:54 ngày 01/10/2018

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.

mmmm viết 03:01 ngày 01/10/2018

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ỗ đó

mmmm viết 02:54 ngày 01/10/2018

b = (f || i++ == 0);
còn cái này có phải là ++ rồi chạy theo trái sang phải f || i đem kq đó so sánh cho 0?

vũ xuân quân viết 02:59 ngày 01/10/2018

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

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 ?

mmmm viết 03:06 ngày 01/10/2018

i == 0 rồi đem && với f rồi mới tăng i

anon52681320 viết 03:09 ngày 01/10/2018

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.

viết 03:05 ngày 01/10/2018

Bạn tham khảo thêm nhé!

Bài liên quan
0