代码之家  ›  专栏  ›  技术社区  ›  Suma

bool operator++和--

  •  99
  • Suma  · 技术社区  · 15 年前

    今天,在编写一些Visual C++代码时,我遇到了一些令我吃惊的事情。似乎C++支持BoL的++(增量),但不支持(递减)。这只是一个随机的决定,还是背后有什么原因?

    编译:

    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 回复  |  直到 9 年前
        1
  •  87
  •   Craig M. Brandenburg Martin    12 年前

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

    如果 x 是一个 int ,但我使用它作为布尔值,根据 if(x)... 那么,递增意味着无论它在操作之前的真值是多少,它的真值都是 true 之后(禁止溢出)。

    然而,无法预测 -- 只知道 X 因为它可能导致 false (如果整数值为1)或 (如果整数值是其他值-特别是包括0[ ]和2个或更多[ )

    所以作为一只短手 ++ 工作,以及 —— 没有。

    ++ 为了与此兼容,允许在bools上使用,但在标准中不推荐使用它。


    假设我 只有 使用 X 作为一个布尔值,这意味着在我完成之前不会发生溢出。 ++ 经常会导致它自己的溢出。即使使用char作为类型, CHAR_BITS 低到5,这是32次,在此之前,这不再有效(这仍然足够证明这是一个糟糕的实践,我不是在为实践辩护,只是解释为什么它有效)为32位 int 我们当然要用 ++ 在这是一个问题之前2^32次。用 —— 尽管它只会导致 如果我从1开始 ,或以0开头并使用 ++ 就在这之前。

    这是不同的,如果我们从一个只有几个低于0的值开始。事实上,在这种情况下,我们可能需要 ++ 导致 最终价值,如:

    int x = -5;
    while(++x)
      doSomething(x);
    

    然而,这个例子处理 X 作为一个 int 除条件外的任何地方,所以它相当于:

    int x = -5;
    while(++x != 0)
      doSomething(x);
    

    这和只使用不同 X 作为布尔值。

        2
  •  30
  •   Nordic Mainframe    15 年前

    ANSI ISO IEC 14882 2003(C++ 03):

    5.2.6-2

    后缀的操作数--is 类似于后缀的减量 ++运算符,但操作数不应为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的++已弃用。

        3
  •  9
  •   Abhay    15 年前

    由于历史原因,这得到了支持。但请注意… 使用C++操作符的BooL类型的操作数被禁止,参见C++标准中的第5.3.2节(N3092)。

    5.3.2增减量[expr.pre.incr]

    • 前缀+的操作数被修改 通过添加1或设置为true(如果是) bool(此用法已弃用)。这个 操作数应为可修改的左值。 操作数的类型应为 算术类型或指向 完全定义的对象类型。这个 结果是更新的操作数;它是 一个左值,它是一个位字段,如果 操作数是位字段。如果X是 不是bool类型,表达式++x 等于x+=1[注:见 添加(5.7)和 分配运算符(5.17) 有关转换的信息。结束笔记 ]
    • 前缀-的操作数被修改 减去1。操作数应 不是bool类型。要求 关于前缀的操作数--和 其结果的性质为 否则与前缀相同 ++。
        4
  •  2
  •   mustafagonul    10 年前
    • 用旧的标准(C++ 98),它不是一个错误。
    • 随着新标准的增加,布尔值已被弃用。(C++ 11)
    • 可以在布尔值上使用增量,直到C++ 17。