它来自使用整数值作为布尔值的历史。
Ifx
是一个int
,但我将它用作布尔值,if(x)...
然后递增将意味着无论它在操作之前的真值如何,它都将true
在它之后具有一个真值(除非溢出)。
但是,不可能--
仅预测给定知识的结果 的真值x
,因为它可能导致false
(如果积分值为 1)或true
(如果积分值为其他任何值 - 特别是这包括 0 [ false
] 和 2 或更多 [ true
])。
所以作为一个短手++
工作,并--
没有。
++
为了与此兼容,允许在 bool 上使用,但在标准中已弃用它,并在 C++17 中将其删除。
这假设我只用作x
布尔值,这意味着溢出不会发生,直到我++
经常完成足以导致它自己的溢出。即使使用 char 作为使用的类型并且CHAR_BITS
像 5 这样的低值,在这不再起作用之前是 32 次(这仍然足以证明它是一种不好的做法,我不是为这种做法辩护,只是解释它为什么起作用)对于 32 位int
,我们当然必须使用++
2^32 次才能成为问题。--
虽然它只会导致如果我以false
1 的值true
开始,或者以 0 开始并且++
之前精确使用过一次。
如果我们从一个略低于 0 的值开始,情况就不同了。确实,在这种情况下,我们可能希望最终++
得到该false
值,例如:
int x = -5;
while(++x)
doSomething(x);
但是,此示例将除条件之外的任何地方都x
视为一个int
,因此它等效于:
int x = -5;
while(++x != 0)
doSomething(x);
这与仅用x
作布尔值不同。