对布尔值使用逐位not运算符(~)是否会调用Undefined Behavior
Does using bitwise not operator (~) on boolean values invoke Undefined Behavior?
如果C++程序将按位非运算符(~)应用于布尔值,会调用Undefined Behavior吗?
例如,以下程序是否定义明确?
bool f = false;
bool f2 = ~f; // is f2 guaranteed to be true, or is this UB?
bool t = true;
bool t2 = ~t; // is t2 guaranteed to be false, or is this UB?
(是的,我知道有一个!运算符更适合这类事情;出于这个问题的目的,我们将忽略它的存在;)
5.3.1.10
~
的操作数应为整数或非整数枚举类型;结果是一个操作数的补码执行整体促销[强调矿]4.5/6类型
bool
的prvalue可以转换为类型int
的prvalue,其中false
变为零,true
变为一。4.5/7这些转换称为积分促销。
因此,~false
是一个int
,其比特模式由全1组成,即表示0的比特模式的补码,即全零(如3.9.1/7所要求的)。类似地,~true
是int
,其是1的比特表示的补码——即具有最低有效比特零的所有1。在布尔上下文中,这两个值都将计算为true
。
算术运算符对其操作数执行积分提升。具体地说[expr.unary.op]/9表示~
也会发生这种情况。
所以~t
和~1
是一样的。这会给出一个有效的非零整数。
整数到布尔的转换由[conv.pool]定义:
零值、空指针值或空成员指针值转换为false;任何其他值都转换为真正的
所以CCD_ 14产生CCD_。没有未定义的行为。
CCD_ 16与CCD_。在2的补码中,~0
给出-1
,因此我们将得到f2 == true
。
在1的补码中——如果有一个C++系统使用1的补号——那么~0
的作用尚不清楚
bool t = true;
bool t2 = ~t; // is t2 guaranteed to be false, or is this UB?
我想这是不能保证的,看看
bool b = true;
bool b1 = ~b;
cout << b1;
输出"真实"
我想这与布尔表示有关。。。如果它是一个字节,则00000001
将对不为零的11111110
取反。晋升可能也在起作用,但这是一样的。
这里的关键是它是"按位"的,而不是"合乎逻辑的"。因此,除非布尔表示是一位,否则不应该期望两者匹配。
易于完全定义的行为。
- 如何检查在编译时是否调用了模板化方法?
- 通过引用传递对象时是否调用复制构造函数?
- 如何在类中检查是否调用宏
- 传递类 by-value 时,调用方或被调用方是否调用析构函数
- 如何检查是否调用了成员方法
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换
- 编译器如何知道是否调用 const 重载
- stl 优先级队列中的堆管理是否调用复制构造函数
- 此代码是否调用不存在的构造函数?
- 以下 C/C++ 代码是否调用未定义的行为
- Type t=Type()是否调用复制构造函数
- 检查是否调用了复制构造函数
- 以下代码是否调用未定义的行为
- std:map 析构函数是否调用键析构函数以及值析构函数?
- 当我在extern c中创建对象时,是否调用了c++类析构函数
- vector是否调用指向对象的指针的析构函数
- ToUnicode是否调用ToUnicodeEx?ToUnicodeEx在内核空间线程上更改了什么
- 如何在编译时检查是否调用了函数
- unique_ptr::release()是否调用析构函数