Sum*_*uma 101 c++ boolean increment
今天在编写一些Visual C++代码时,我遇到了令我惊讶的事情.似乎C++支持bool的++(增量),但不支持 - (减量).这只是一个随机决定,还是有一些原因呢?
这编译:
static HMODULE hMod = NULL;
static bool once = false;
if (!once++)
hMod = LoadLibrary("xxx");
Run Code Online (Sandbox Code Playgroud)
这不是:
static HMODULE hMod = NULL;
static bool once = true;
if (once--)
hMod = LoadLibrary("xxx");
Run Code Online (Sandbox Code Playgroud)
Jon*_*nna 89
它来自使用整数值作为布尔值的历史.
如果x
是一个int
,但我使用它作为布尔值,if(x)...
那么递增将意味着无论它在操作之前的真值,它将具有它true
之后的真值(禁止溢出).
然而,不可能--
仅仅预测真实值的给定知识的结果x
,因为它可能导致false
(如果积分值为1)或true
(如果积分值是其他任何东西 - 特别是这包括0 [ false
]和2或更多[ true
]).
所以作为一个简单的++
工作,并--
没有.
++
允许在bools上与此兼容,但在标准中不推荐使用它.
这假定我只使用x
作为一个布尔值,这意味着不可能发生溢出,直到我做++
往往不足以引起它自己的溢出.即使使用char作为所使用的类型和CHAR_BITS
类似5的低点,在此之前的32次不再起作用(这仍然是足够的论据,因为它是一种不好的做法,我不是在捍卫这种做法,只是解释它为什么有效)对于32位,int
我们当然必须使用++
2 ^ 32次才能解决这个问题.随着--
虽然它只会造成false
当我开始为值1 true
,或开始用0和使用++
前,正是一次.
如果我们从一个低于0的值开始,这是不同的.实际上,在这种情况下,我们可能希望最终++
产生false
值,例如:
int x = -5;
while(++x)
doSomething(x);
Run Code Online (Sandbox Code Playgroud)
然而,这个例子把x
作为一个int
无处不在,除了有条件的,所以它等同于:
int x = -5;
while(++x != 0)
doSomething(x);
Run Code Online (Sandbox Code Playgroud)
这与仅使用x
布尔值不同.
Nor*_*ame 30
ANSI ISO IEC 14882 2003(c ++ 03):
5.2.6-2
后缀的操作数 - 与postfix ++运算符类似地递减,除了操作数不应该是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的++已经弃用了.
由于历史原因,这得到了支持.但请注意...... 不推荐使用bool类型的操作数和++运算符,请参阅C++标准中的第5.3.2节(n3092)
5.3.2递增和递减[expr.pre.incr]
归档时间: |
|
查看次数: |
14804 次 |
最近记录: |