3

如果我有以下代码:

int a = 1;
bool b = 1;

a等于b吗?甚至程序可能会返回它们相同,它们实际上在低级别的所有方面都相等吗?

另外,如果我使用代码(伪),例如:

if (a)
then execute();

execute()跑吗?我在寻求理论上的答案,我无法用实验说服自己,因为这不是自然科学。谢谢你们。

4

4 回答 4

10

我认为您可以通过正确的实验来说服自己:

#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只能有两个值:trueand false, whileint可以有更多。这是另一个显示此结果的实验​​:

#include <cassert>

int main() {
    int a = 2;
    bool b = 2;
    assert(a != b);
}

这两种类型可能看起来很相似,因为两者之间存在隐式转换。任何为零的积分表达式都可以隐式转换为false,任何不为零的积分表达式都可以隐式转换为true。在相反的方向,false可以隐式转换为零,并true转换为一。这导致上面的代码最终测试 if 2 != 1。

现在问题execute();的片段中是否调用的问题的答案应该很明显:该值aboolif语句中转换为 a ,并且由于它不为零,因此它将转换为true并导致调用execute().

于 2012-07-06T01:05:44.300 回答
5

true当在布尔上下文中使用时,非零数值或指针表达式将计算为。同样,零表达式的计算结果为false。但是,anint和 abool是不同的类型,所以它们并不相同。

于 2012-07-06T01:09:44.760 回答
4

a等于b吗?甚至程序可能会返回它们相同,它们实际上在低级别的所有方面都相等吗?

这完全取决于您的意思equal。类型不同,这意味着内存中的表示可能会有所不同(编译器可以自由地将这两者表示为完全相同,但也可以自由地做其他事情)。在大多数编译器/架构中,bool只占用一个字节的存储空间并且int具有更大的大小(通常为 4 个字节,但这取决于架构)。

除了不同的大小,编译器会以不同的方式处理这两种类型(不仅仅是加载和存储到内存,而且操作也会不同。您只能将 0 和 1 存储在 bool 中,这意味着某些操作可能会使用它例如,在本文中,您会发现一个条件测试的实现不同的情况(注意,本文有一个未定义行为的情况,导致 abool对两者进行评估,truefalse对于编译器假设的测试只能bool是 0 或 1,这不会发生在int)

从逻辑的角度来看,语言决定了不同类型在操作中的使用方式,特别是如果您尝试在程序中比较ab,表达式的结果将是true. 请注意,这并不意味着它们完全相同,该语言定义了一组转换规则,用于将两个变量转换为相同的类型,并在该类型中执行比较。在这种情况下,转换将是int。变量将bool转换为0iffalse1if true

另外,如果我使用代码(伪),例如:if (a) execute(),execute() 会运行吗?

是的。在这种情况下, 内部的条件if需要一个bool值,因此转换将是 fromintboolfalse如果整数值为,则该标准定义转换为 yield 0true否则,有效地执行等效于if (a!=0)。由于ais 1,条件成立execute()并将被评估。

于 2012-07-06T01:30:50.357 回答
1

该线程讨论了与字符相比的 c++ 布尔值,但它会让您对引擎盖下发生的事情有一个很好的了解。为什么 c++ 中 char 和 bool 的大小相同?

于 2012-07-06T01:12:50.003 回答