Nó xuất phát từ lịch sử sử dụng các giá trị số nguyên làm boolean.
Nếu x
là một int
, nhưng tôi đang sử dụng nó như một boolean if(x)...
thì tăng dần sẽ có nghĩa là bất kể giá trị chân lý của nó trước hoạt động, nó sẽ có giá trị chân lý true
sau nó (chặn tràn).
Tuy nhiên, không thể dự đoán kết quả của --
kiến thức đã cho chỉ về giá trị chân lý của x
, vì nó có thể dẫn đến false
(nếu giá trị tích phân là 1) hoặc true
(nếu giá trị tích phân là bất kỳ thứ gì khác - đặc biệt là điều này bao gồm 0 [ false
] và 2 hoặc thêm [ true
]).
Vì vậy, như một bàn tay ngắn ++
đã hoạt động, và --
không.
++
được cho phép trên bools để tương thích với điều này, nhưng việc sử dụng nó không được chấp nhận trong tiêu chuẩn.
Điều này giả định rằng tôi chỉ sử dụng x
như một boolean, có nghĩa là tràn không thể xảy ra cho đến khi tôi thực hiện ++
đủ thường xuyên để gây ra tràn. Ngay cả với char là loại được sử dụng và CHAR_BITS
một cái gì đó thấp như 5, đó là 32 lần trước khi điều này không hoạt động nữa (điều đó vẫn đủ lập luận cho nó là một thực hành xấu, tôi không bảo vệ phương pháp này, chỉ giải thích tại sao nó hoạt động) đối với 32-bit, int
tất nhiên, chúng tôi sẽ phải sử dụng ++
2 ^ 32 lần trước khi điều này xảy ra. Với --
mặc dù nó sẽ chỉ dẫn đến false
nếu tôi bắt đầu với giá trị 1 cho true
hoặc bắt đầu bằng 0 và được sử dụng ++
chính xác một lần trước đó.
Điều này sẽ khác nếu chúng ta bắt đầu với một giá trị nhỏ hơn 0. Thật vậy, trong trường hợp như vậy, chúng ta có thể muốn ++
dẫn đến false
giá trị cuối cùng chẳng hạn như trong:
int x = -5;
while(++x)
doSomething(x);
Tuy nhiên, ví dụ này được coi x
là int
ở mọi nơi ngoại trừ điều kiện, vì vậy nó tương đương với:
int x = -5;
while(++x != 0)
doSomething(x);
Khác với việc chỉ sử dụng x
làm boolean.