如果我有以下代码:
int a = 1;
bool b = 1;
a等于b吗?即使程序可能会返回它们是相同的,它们在低级别的所有方面实际上是否相等?
另外,如果我使用代码(伪),例如:
if (a)
then execute();
会execute()
运行吗?我在寻求理论上的答案,我不能用实验来说服自己,因为这不是自然科学。谢谢大家。
答案 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
只能有两个值:true
和false
,而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
。但是,int
和bool
是不同的类型,因此它们不相同。
答案 2 :(得分:4)
a等于b吗?即使程序可能会返回它们是相同的,它们在低级别的所有方面实际上是否相等?
这完全取决于相等的含义。类型是不同的,这意味着内存中的表示可能会有所不同(编译器可以自由地将这两个表示为完全相同,但它也可以自由地执行)。在大多数编译器/体系结构中,bool
只占用一个字节的存储空间而int
的大小更大(通常为4个字节,但这取决于体系结构)。
除了不同的大小,编译器会以不同的方式处理这两种类型(不仅仅是对内存的加载和存储,而且操作也会不同。你只能在bool中存储0和1,这意味着一些操作可能会使用这些知识。例如,在this article中,您会发现一个案例,其中条件测试的实现不同(注意,该文章有一个未定义行为的案例导致bool
评估对于true
和false
,对于测试,编译器假设bool
只能是0或1,而int
不会发生这种情况
从逻辑的角度来看,该语言决定了不同类型在操作中的使用方式,特别是如果您尝试在程序中比较a
和b
,则表达式的结果将是true
。请注意,这并不意味着它们完全相同,该语言定义了一组转换规则,用于将两个变量转换为相同的类型,并在该类型中执行比较。在这种情况下,转化将是int
。如果bool
,0
变量将转换为false
,如果1
,则转换为true
。
另外,如果我使用代码(伪),例如:
if (a) execute()
,那么execute()会运行吗?
是。在这种情况下,if
内的条件需要bool
值,因此转化时间为int
到bool
。如果整数值为false
,则标准将转换定义为生成0
,否则将true
定义为等效if (a!=0)
。由于a
为1
,因此条件成立并且execute()
将被评估。
答案 3 :(得分:1)
这个帖子谈到了与字符相比较的c ++布尔值,但是它会让你很好地了解幕后发生的事情。 Why is a char and a bool the same size in c++?