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.