bool运算符++和 -

时间:2010-08-10 15:08:20

标签: c++ boolean increment

今天在编写一些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");

4 个答案:

答案 0 :(得分:88)

它来自使用整数值作为布尔值的历史。

如果xint,但我按照if(x)...使用它作为布尔值,那么递增意味着无论操作之前的真值如何,它都会有真相-true之后的值(禁止溢出)。

然而,仅--仅知道x的真值,才能预测false的结果,因为它可能导致true(如果积分值为1)或false(如果积分值是其他任何值 - 特别是这包括0 [true]和2 [或{1}}]。

因为简写++工作,而--没有。

bools允许

++与此兼容,但标准中不推荐使用它。


这假设我使用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]

  • 修改前缀++的操作数 通过添加1,或设置为true(如果是) bool(此用法已弃用)。该 操作数应是可修改的左值。 操作数的类型应为a 算术类型或指向的指针 完全定义的对象类型。该 result是更新的操作数;它是 一个左值,如果是一个位域 操作数是一个位域。如果x是 不是bool类型,表达式++ x 相当于x + = 1 [注:见 讨论增加(5.7)和 赋值运算符(5.17)for 有关转化的信息。 - 注意 ]
  • 修改了前缀的操作数 通过减去1.操作数应该 不是bool型。要求 在前缀的操作数上 - 和 其结果的属性是 否则与前缀相同 ++。

答案 3 :(得分:2)

  • 使用旧标准(C ++ 98)并不是错误。
  • 随着新标准的增加,不推荐使用布尔值。 (C ++ 11)
  • 您可以在布尔值上使用增量,直到C ++ 17。