如果我有以下代码:
int a = 1;
bool b = 1;
a等于b吗?甚至程序可能会返回它们相同,它们实际上在低级别的所有方面都相等吗?
另外,如果我使用代码(伪),例如:
if (a)
then execute();
会execute()
跑吗?我在寻求理论上的答案,我无法用实验说服自己,因为这不是自然科学。谢谢你们。
我认为您可以通过正确的实验来说服自己:
#include <type_traits>
int main() {
int a = 1;
bool b = 1;
static_assert(! std::is_same<decltype(a), decltype(b)>::value,
"No, they are not the same on all aspects");
}
也许两者之间最重要的区别是bool
只能有两个值:true
and false
, whileint
可以有更多。这是另一个显示此结果的实验:
#include <cassert>
int main() {
int a = 2;
bool b = 2;
assert(a != b);
}
这两种类型可能看起来很相似,因为两者之间存在隐式转换。任何为零的积分表达式都可以隐式转换为false
,任何不为零的积分表达式都可以隐式转换为true
。在相反的方向,false
可以隐式转换为零,并true
转换为一。这导致上面的代码最终测试 if 2 != 1。
现在问题execute();
的片段中是否调用的问题的答案应该很明显:该值a
将bool
在if
语句中转换为 a ,并且由于它不为零,因此它将转换为true
并导致调用execute()
.
true
当在布尔上下文中使用时,非零数值或指针表达式将计算为。同样,零表达式的计算结果为false
。但是,anint
和 abool
是不同的类型,所以它们并不相同。
a等于b吗?甚至程序可能会返回它们相同,它们实际上在低级别的所有方面都相等吗?
这完全取决于您的意思equal。类型不同,这意味着内存中的表示可能会有所不同(编译器可以自由地将这两者表示为完全相同,但也可以自由地做其他事情)。在大多数编译器/架构中,bool
只占用一个字节的存储空间并且int
具有更大的大小(通常为 4 个字节,但这取决于架构)。
除了不同的大小,编译器会以不同的方式处理这两种类型(不仅仅是加载和存储到内存,而且操作也会不同。您只能将 0 和 1 存储在 bool 中,这意味着某些操作可能会使用它例如,在本文中,您会发现一个条件测试的实现不同的情况(注意,本文有一个未定义行为的情况,导致 abool
对两者进行评估,true
而false
对于编译器假设的测试只能bool
是 0 或 1,这不会发生在int
)
从逻辑的角度来看,语言决定了不同类型在操作中的使用方式,特别是如果您尝试在程序中比较a
和b
,表达式的结果将是true
. 请注意,这并不意味着它们完全相同,该语言定义了一组转换规则,用于将两个变量转换为相同的类型,并在该类型中执行比较。在这种情况下,转换将是int
。变量将bool
转换为0
iffalse
或1
if true
。
另外,如果我使用代码(伪),例如:
if (a) execute()
,execute() 会运行吗?
是的。在这种情况下, 内部的条件if
需要一个bool
值,因此转换将是 fromint
到bool
。false
如果整数值为,则该标准定义转换为 yield 0
,true
否则,有效地执行等效于if (a!=0)
。由于a
is 1
,条件成立execute()
并将被评估。
该线程讨论了与字符相比的 c++ 布尔值,但它会让您对引擎盖下发生的事情有一个很好的了解。为什么 c++ 中 char 和 bool 的大小相同?