Ngày xưa của C, không có kiểu boolean. Mọi người đã sử dụng int
để lưu trữ dữ liệu boolean và nó hoạt động chủ yếu. Zero là sai và mọi thứ khác đều đúng.
Điều này có nghĩa là nếu bạn lấy int flag = 0;
và sau đó flag++
, giá trị sẽ là đúng. Điều này sẽ hoạt động bất kể giá trị của cờ là bao nhiêu (trừ khi bạn đã làm rất nhiều, nó cuộn lại và bạn trở về số 0, nhưng hãy bỏ qua điều đó) - tăng cờ khi giá trị của nó là 1 sẽ cho 2, vẫn là thật.
Một số người đã sử dụng điều này để đặt vô giá trị boolean thành true. Tôi không chắc nó đã trở thành thành ngữ , nhưng trong một số mã.
Điều này không bao giờ có tác dụng --
, bởi vì nếu giá trị là bất cứ thứ gì ngoài 1 (có thể là nó), thì giá trị vẫn sẽ không sai. Và nếu nó đã sai ( 0
) và bạn đã thực hiện một toán tử giảm dần trên nó, thì nó sẽ không sai.
Khi chuyển mã từ C sang C ++ trong những ngày đầu, điều rất quan trọng là mã C có trong C ++ vẫn có thể hoạt động. Và như vậy, trong đặc tả cho C ++ (phần 5.2.6 (trên trang 71)), nó đọc:
Giá trị thu được bằng cách áp dụng một postfix ++ là giá trị mà toán hạng đã có trước khi áp dụng toán tử. [Lưu ý: giá trị thu được là bản sao của giá trị ban đầu] Toán hạng sẽ là giá trị có thể sửa đổi. Loại toán hạng sẽ là loại số học hoặc con trỏ đến loại đối tượng hoàn chỉnh. Sau khi kết quả được ghi chú, giá trị của đối tượng được sửa đổi bằng cách thêm 1 vào nó, trừ khi đối tượng có kiểu bool
, trong trường hợp đó, nó được đặt thành true. [Lưu ý: việc sử dụng này không được chấp nhận, xem phụ lục D.]
Toán hạng của postfix - được giảm tương tự cho toán tử postfix ++, ngoại trừ toán hạng sẽ không phải là kiểu bool
.
Điều này một lần nữa được đề cập trong phần 5.3.2 (đối với toán tử tiền tố - 5.2.6 là về hậu tố)
Như bạn có thể thấy, phần này không được dùng nữa (Phụ lục D trong tài liệu, trang 709) và không nên sử dụng.
Nhưng đó là lý do tại sao. Và đôi khi bạn có thể thấy mã. Nhưng đừng làm điều đó.