01/10/2018, 17:18

Về biểu thức điều kiện

Dạ em mới bắt đầu thử học về lập trình C++. Em có một đoạn code như sau:
Capture
Đáp án là 1 mà e không hiểu tại sao.
Mong mọi người giúp em.

Khoa NTA viết 19:30 ngày 01/10/2018

Điều gì đã ngăn cản bạn test trên đoạn code đó? Có máy tính, có IDE sẵn đó thì mở lên rồi thử-sai đi, sai thì có mất gì đâu mà không làm hả trời?
Có thể thử nhiều cách như: thử đặt thêm các cặp ngoặc () ở nhiều vị trí khác để xem rồi tự rút ra kết luận đi chứ. Bằng cách đặt các cặp ngoặc đúng vị trí thì biểu thức luận lý này sẽ cho ra kết quả giống nhau, sau đó thay đổi các toán tử (như != thành == chẳng hạn) và lặp lại quá trình trên sẽ cho ra kết quả chính xác mà compiler biến đổi biểu thức trên.
Hoặc dùng cách đơn giản hơn là từ khóa chaining comparisionsC++ operator precedence, đọc và nghiệm ra đi :v
Khi compile, bạn có để ý thấy cái warnings nào không? Có thấy mà không để ý hay không thấy? Nếu không thấy thì đổi IDE/compiler đi

warning: suggest parentheses around comparison in operand of '!=' [-Wparentheses]
Summary

Bạn nghĩ là như thế này?

(num1 > 2 + num2 != 3) == ((num1 > 2) + (num2 != 3))

Nhưng thực ra, nó là như thế này:

(num1 > 2 + num2 != 3) == ((num1 > (2 + num2)) != 3)

Bằng cách đọc 2 link trên, chắc bạn cũng biết được là: thứ tự của các toán tử + - * / đứng trên các toán tử so sánh, nên cái nào cao thì làm trước, bằng nhau thì từ trái sang. Chuyện là vậy đó
Mà tại sao phải viết đoạn code trên Thích tự thử thách? Thích tự làm khó mình? Thích khổ d*m? Thích tạo khó khăn mặc dù nó đơn giản? Thích như vậy sao không chơi một mình thôi, đem lên đây chi?
Đừng nói là đang học C++, gặp câu này khó qué nên đem lên hỏi? Ủa người khác trả lời rồi chỗ nào dành cho bản thân động não? Vậy rồi sao tự học?

rogp10 viết 19:23 ngày 01/10/2018

Đáp án là 1 mà e không hiểu tại sao.

Nếu nghĩ như bạn thì x + y < 100 phải là x + (y < 100) (sai, vì bạn ko cần biết y < 100 hay không)
Bạn có thể thấy vì sao != ưu tiên thấp hơn > (xét x > y == z > t ), nên bỏ ngoặc đầy đủ thì nó là:
(num1 > (2 + num2)) != 3.

ghi chú :<

Ban đầu mình còn lầm mà mấy biểu thức này vô bổ lắm.

Lê Thái Việt Hoàng viết 19:28 ngày 01/10/2018

Dạ em cảm ơn anh đã giúp em.

Lê Thái Việt Hoàng viết 19:28 ngày 01/10/2018

Dạ em cảm ơn anh đã giúp em

rogp10 viết 19:32 ngày 01/10/2018

Vậy bạn đánh tick cho @nicklauri nhé

Bài liên quan
0