今天在编写一些Visual C ++代码时,我遇到了让我感到惊讶的事情。似乎C ++支持bool的++(增量),但不支持 - (减量)。这只是一个随机的决定,或者背后有一些原因?
编译:
static HMODULE hMod = NULL;
static bool once = false;
if (!once++)
hMod = LoadLibrary("xxx");
这不是:
static HMODULE hMod = NULL;
static bool once = true;
if (once--)
hMod = LoadLibrary("xxx");
答案 0 :(得分:88)
它来自使用整数值作为布尔值的历史。
如果x
是int
,但我按照if(x)...
使用它作为布尔值,那么递增意味着无论操作之前的真值如何,它都会有真相-true
之后的值(禁止溢出)。
然而,仅--
仅知道x
的真值,才能预测false
的结果,因为它可能导致true
(如果积分值为1)或false
(如果积分值是其他任何值 - 特别是这包括0 [true
]和2 [或{1}}]。
因为简写++
工作,而--
没有。
++
与此兼容,但标准中不推荐使用它。
这假设我仅使用x
作为布尔值,这意味着溢出不会发生,直到我经常++
经常导致溢出就会发生溢出拥有。即使使用char作为类型,CHAR_BITS
低于5的东西,在此之前的32次不再起作用(这仍然足以让它成为一种不好的做法,我不是在捍卫这种做法,只是解释为什么它有效)对于32位int
我们当然必须使用++
2 ^ 32次才能解决这个问题。使用--
但如果我以false
的值1开头,或者以0开头并且之前恰好使用过true
,则只会生成++
。
如果我们从一个低于0的值开始,则会有所不同。的确,在这种情况下,我们可能希望++
最终导致false
值,例如: / p>
int x = -5;
while(++x)
doSomething(x);
但是,除了条件之外,此示例将x
视为int
,因此它等同于:
int x = -5;
while(++x != 0)
doSomething(x);
与仅使用x
作为布尔值不同。
答案 1 :(得分:30)
ANSI ISO IEC 14882 2003(c ++ 03):
5.2.6-2
后缀的操作数 - 是 类似于后缀减少 ++运算符,但操作数不应为bool类型。 [注意:为 前缀增量和减量,请参阅 5.3.2。 ]
毫不奇怪......
5.3.2-2
前缀的操作数 - 被修改 通过减去1.操作数应该 不是bool型。要求 在前缀的操作数上 - 和 否则其结果的属性 与前缀++相同。 [注意: 对于后缀增量和减量, 见5.2.6。 ]
同样,5.6.2-1和5.3.2-1提到用于bools的++应该是真的,而附录D-1表示对bools的++已经弃用了。
答案 2 :(得分:9)
由于历史原因,这得到了支持。但请注意...... 不推荐使用bool类型的操作数和++运算符,请参阅C ++标准(n3092)中的第5.3.2节
5.3.2递增和递减[expr.pre.incr]
答案 3 :(得分:2)