Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
布尔运算符++;及-- 在编写一些Visual C++代码的今天,我遇到了一些令我吃惊的事情。似乎C++支持BoL的++(增量),但不支持(减量)。这只是一个随机的决定,还是背后有某种原因_C++_Boolean_Increment - Fatal编程技术网

布尔运算符++;及-- 在编写一些Visual C++代码的今天,我遇到了一些令我吃惊的事情。似乎C++支持BoL的++(增量),但不支持(减量)。这只是一个随机的决定,还是背后有某种原因

布尔运算符++;及-- 在编写一些Visual C++代码的今天,我遇到了一些令我吃惊的事情。似乎C++支持BoL的++(增量),但不支持(减量)。这只是一个随机的决定,还是背后有某种原因,c++,boolean,increment,C++,Boolean,Increment,这包括: 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"); ANSI ISO IEC 14882 2003(c++03): 5.2.6-2 后缀的

这包括:

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");

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

5.2.6-2

后缀的操作数为 类似于后缀的递减 ++运算符,但操作数不应为bool类型。[注:适用于 前缀递增和递减,请参见 5.3.2.】

不出所料

5.3.2-2

prefix--的操作数已修改 减去1。操作数应为 不是布尔型的。要求 关于prefix的操作数-,以及 其结果的性质是相反的 与prefix++相同。[注: 对于后缀增量和减量, 见5.2.6。]


此外,5.6.2-1和5.3.2-1提到布尔值的++应为真,附录D-1指出布尔值的++已被弃用。

它来源于使用整数值作为布尔值的历史

如果
x
是一个
int
,但我根据
If(x)…
将其用作布尔值,则递增意味着无论其在操作之前的真值是多少,其后面都会有一个真值
true
(除非溢出)

但是,如果只知道
x
的真值,就不可能预测
-
的结果,因为它可能导致
false
(如果整数值为1)或
true
(如果整数值为其他值-尤其是包括0[
false
]和2或更多[
true
])

因此,简写的
++
有效,而
--
无效

bools上允许使用
++
,以与此兼容,但标准中不推荐使用它,并在C++17中删除了它


这假设我只使用
x
作为布尔值,这意味着在我经常使用
++
导致溢出之前,溢出不会发生。即使使用char作为类型,并且
char\u BITS
值较低,比如5,这已经是32次了,但这已经不起作用了(这仍然是一个足够的理由,因为这是一个糟糕的做法,我不是在为这种做法辩护,只是解释它为什么起作用)对于32位的
int
,我们当然必须使用
++
2^32次,然后才能成为问题。使用
--
,但如果我从
true
的值1开始,或者从0开始,并在之前准确地使用了一次
++
,则只会导致
false

如果我们从一个低于0的值开始,这是不同的。实际上,在这种情况下,我们可能希望
++
最终导致
false
值,例如:

int x = -5;
while(++x)
  doSomething(x);
但是,本例将
x
视为
int
,除了条件之外,其他地方都是如此,因此它相当于:

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

这与仅将
x
用作布尔值不同。

由于历史原因,支持此操作。但请注意。。。 使用C++操作符的类型BOOL的操作数被禁止使用参见C++标准(N3092)

中的5.3.2节。 5.3.2增量和减量[expr.pre.incr]

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

      HM,与XCODE和GCC编译程序相同,“代码> ++1次< /代码>和<代码> +++/COD>与GCC一起工作,但不是减量。可能重新标记“历史”而不是“操作符关键字”,所以这与所有其他有趣的解释相结合,为什么各种疯狂的事情在考虑历史时是合理的?注意:从C++17开始,
      bool
      的预增量运算符已被弃用。如果您想要非弃用的内容,可以用
      std::exchange(once,false)
      (注意:非原子)替换。@BlueRaja:请参阅Jon Hanna的答案。谢谢。很好的知道,我仍然可以给出这样的答案,考虑到我写了一行C++的时间是多长时间了),但是如果X是-1(在像VB这样的平台中是真的),++X将是假的。@杰姆斯,在C和C++中,我想的时候,我会想到(“禁止溢出”)。实际上,在VB中,任何非零都有真值TRUE(就像在C中一样),但是它们有-1而不是1作为真布尔运算的结果,因为NOT(TRUE)是FALSE,NOT(FALSE)是TRUE,x或TRUE是TRUE,x或FALSE是x,x和FALSE是FALSE,x和TRUE是x,等等,使用相同的运算符进行布尔运算和位运算(因为VB假设两个补码so-1都是1位)。但是,如果编码器没有捕捉到2(真)和4(真)结果为0(假),这可能会导致VB中出现一些奇怪的错误@JonHanna:ANSI C89是第一个C标准。ANSI C委员会发明了
      头和
      CHAR\u-BIT
      宏。在此之前,我认为理论上可能有
      CHAR
      小于8位的实现,但是