编译器是否同样处理int和bool类型?

时间:2012-07-06 01:03:08

标签: c++ types

如果我有以下代码:

int a = 1;
bool b = 1;

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

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

if (a)
then execute();

execute()运行吗?我在寻求理论上的答案,我不能用实验来说服自己,因为这不是自然科学。谢谢大家。

4 个答案:

答案 0 :(得分:9)

我认为你可以用the right experiments说服自己:

#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只能有两个值:truefalse,而int可以有更多值。这里显示了another experiment的结果:

#include <cassert>

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

这两种类型看似相似,因为两者之间存在隐式转换。任何为零的整数表达式都可以隐式转换为false,任何非零的整数表达式都可以隐式转换为true。在相反的方向上,false可以隐式转换为零,true转换为1。如果2!= 1,这导致上面的代码结束测试。

现在,问题代码段中是否调用execute();的问题的答案显而易见:值a将转换为bool if }}语句,因为它不为零,它将转换为true并导致调用execute()

答案 1 :(得分:5)

在布尔上下文中使用时,非零数字或指针表达式将计算为true。同样,零表达式将计算为false。但是,intbool是不同的类型,因此它们不相同。

答案 2 :(得分:4)

  

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

这完全取决于相等的含义。类型是不同的,这意味着内存中的表示可能会有所不同(编译器可以自由地将这两个表示为完全相同,但它也可以自由地执行)。在大多数编译器/体系结构中,bool只占用一个字节的存储空间而int的大小更大(通常为4个字节,但这取决于体系结构)。

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

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

  

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

是。在这种情况下,if内的条件需要bool值,因此转化时间为intbool。如果整数值为false,则标准将转换定义为生成0,否则将true定义为等效if (a!=0)。由于a1,因此条件成立并且execute()将被评估。

答案 3 :(得分:1)

这个帖子谈到了与字符相比较的c ++布尔值,但是它会让你很好地了解幕后发生的事情。 Why is a char and a bool the same size in c++?